获取PHP中的客户机名称
此程序仅返回本地主机中的客户机名称获取PHP中的客户机名称,php,Php,此程序仅返回本地主机中的客户机名称 echo gethostbyaddr($_SERVER['REMOTE_ADDR']) 如果它是从联机服务器运行的,则不会显示计算机名,并且会显示一些其他信息。 因此,当程序从在线服务器运行时,是否仍然可以用php获取计算机名。不是用php。 phpinfo(32)包含PHP能够了解的关于特定客户端的所有信息,并且没有[windows]计算机名这是什么“其他信息”?IP地址 在PHP中,您可以使用$\u SERVER['REMOTE\u ADDR']获取远程客
echo gethostbyaddr($_SERVER['REMOTE_ADDR'])代码>
如果它是从联机服务器运行的,则不会显示计算机名,并且会显示一些其他信息。
因此,当程序从在线服务器运行时,是否仍然可以用php获取计算机名。不是用php。
phpinfo(32)
包含PHP能够了解的关于特定客户端的所有信息,并且没有[windows]计算机名这是什么“其他信息”?IP地址
在PHP中,您可以使用$\u SERVER['REMOTE\u ADDR']
获取远程客户端的IP地址,然后您可以使用尝试将该IP转换为主机名,但并非所有IP都配置了反向映射。PHP手册说:
获取主机名
(PHP>=5.3.0)
获取主机名
看:
享受试试看
echo getenv('COMPUTERNAME');
这将返回您的计算机名。gethostname()
从$\u服务器['REMOTE\u ADDR']
远程访问脚本时使用IP将返回您的internet连接的IP,而不是您的计算机。与大多数评论相反,我认为可以获取客户端的主机名(机器名)在普通PHP中,但它有点“脏”
通过HTTP头请求“NTLM”授权
if (!isset($headers['AUTHORIZATION']) || substr($headers['AUTHORIZATION'],0,4) !== 'NTLM'){
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: NTLM');
exit;
}
您可以强制客户端通过NTLM格式发送授权凭据。客户端发送到服务器的NTLM哈希除了包含登录凭据之外,还包含客户端计算机名。这只适用于跨浏览器和PHP
$auth = $headers['AUTHORIZATION'];
if (substr($auth,0,5) == 'NTLM ') {
$msg = base64_decode(substr($auth, 5));
if (substr($msg, 0, 8) != "NTLMSSPx00")
die('error header not recognised');
if ($msg[8] == "x01") {
$msg2 = "NTLMSSPx00x02"."x00x00x00x00".
"x00x00x00x00".
"x01x02x81x01".
"x00x00x00x00x00x00x00x00".
"x00x00x00x00x00x00x00x00".
"x00x00x00x00x30x00x00x00";
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: NTLM '.trim(base64_encode($msg2)));
exit;
}
else if ($msg[8] == "x03") {
function get_msg_str($msg, $start, $unicode = true) {
$len = (ord($msg[$start+1]) * 256) + ord($msg[$start]);
$off = (ord($msg[$start+5]) * 256) + ord($msg[$start+4]);
if ($unicode)
return str_replace("\0", '', substr($msg, $off, $len));
else
return substr($msg, $off, $len);
}
$user = get_msg_str($msg, 36);
$domain = get_msg_str($msg, 28);
$workstation = get_msg_str($msg, 44);
print "You are $user from $workstation.$domain";
}
}
是的,这不是一个简单易懂的“读取机器名函数”,因为用户会收到一个对话框的提示,但这是一个例子,它确实是可能的(与这里的其他语句相反)
完整的代码可以在这里找到:你在说什么程序?@Borealid:我在这里输入的程序来了。让我再编辑一次。请原谅@Marc B的不可否认的副本:这在localhost中对我很有效。但是当它上线时,我没有得到相同的结果。@Deepak:你可以得到远程主机DNS中的任何内容。你不能强行进入远程用户的计算机并找到他们的机器名-他们不会将这些信息发送给你。你得到了什么?如果你连接到一个完全独立的服务器,你会得到一些不同的东西。这是没有办法的。@Marc B:Static-51.14.34.36.ip-dsl.ekm.eth.net。这是我在线测试时得到的。是的,这是意料之中的。如果在同一台计算机上运行浏览器和Web服务器,它将使用本地环回地址(127.0.0.1/localhost)。当您访问其他服务器上的站点时,脚本将看到浏览器的“外部”地址—可能是您的NAT路由器,也可能是您的ISP代理服务器,等等。。。您将看不到localhost,因为它不再是本地连接。它将不会输出客户端计算机(系统)名称,它只提供服务器计算机名称。我很惊讶这有这么多的赞成票-考虑到它与Swetha的回答一样错误,我怀疑这是否令人愉快。是的!这是不正确的答案。为什么它会得到很多升级票?这会返回服务器名,而不是客户端的机器名。他要求的是客户端计算机名,而不是服务器OP要求的是获取客户端的机器名(用户帐户名>Windows)请为您的答案添加一些解释,以便其他人可以从中学习-此环境变量来自何处?如果gethostname()
接受0参数,我们应该将ip地址放在何处?
$auth = $headers['AUTHORIZATION'];
if (substr($auth,0,5) == 'NTLM ') {
$msg = base64_decode(substr($auth, 5));
if (substr($msg, 0, 8) != "NTLMSSPx00")
die('error header not recognised');
if ($msg[8] == "x01") {
$msg2 = "NTLMSSPx00x02"."x00x00x00x00".
"x00x00x00x00".
"x01x02x81x01".
"x00x00x00x00x00x00x00x00".
"x00x00x00x00x00x00x00x00".
"x00x00x00x00x30x00x00x00";
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: NTLM '.trim(base64_encode($msg2)));
exit;
}
else if ($msg[8] == "x03") {
function get_msg_str($msg, $start, $unicode = true) {
$len = (ord($msg[$start+1]) * 256) + ord($msg[$start]);
$off = (ord($msg[$start+5]) * 256) + ord($msg[$start+4]);
if ($unicode)
return str_replace("\0", '', substr($msg, $off, $len));
else
return substr($msg, $off, $len);
}
$user = get_msg_str($msg, 36);
$domain = get_msg_str($msg, 28);
$workstation = get_msg_str($msg, 44);
print "You are $user from $workstation.$domain";
}
}