获取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";
    }
}