Java当前的计算机名和登录用户?


153

是否可以获取当前登录用户的名称(Windows / Unix)和计算机的主机名?

我认为这只是某些静态环境类的属性。

我已经找到该用户名了

com.sun.security.auth.module.NTSystem NTSystem = new
        com.sun.security.auth.module.NTSystem();
System.out.println(NTSystem.getName());

这是机器名称:

import java.net.InetAddress;
...
String computerName;
...
try {
    computerName = InetAddress.getLocalHost().getHostName();
}

catch(Exception ex) {
    ...
}

第一个仅用于Windows吗?

如果您没有设置主机名,第二个将做什么?


NTSystem班只存在于WindowsJDK分布
BullyWiiPlaza

Answers:


256

要获取当前登录的用户:

System.getProperty("user.name"); //platform independent 

和机器的主机名:

java.net.InetAddress localMachine = java.net.InetAddress.getLocalHost();
System.out.println("Hostname of local machine: " + localMachine.getHostName());

1
是否System.getProperty("user.name"); 在Windows和Linux的工作?
fish鱼

5
但是,该user.name可能是伪造的,因此不应将其用于身份验证。
Raedwald

14
System.getProperty(“ user.name”)当前尚未登录的用户,该用户的安全上下文是JVM运行。
rkosegi

1
至于OP所说的“机器名”或“计算机名”,这个答案是不正确的。Java无法获得“计算机名称”,即在启动过程中及早分配给计算机且与网络无关的名称。所有操作系统都具有此概念,但是不幸的是,此值未在Java中公开。但是,尽管经常但并非总是如此,上述方法的确会返回计算机名称。有关说明,请参见stackoverflow.com/a/40702767/1504556
peterh '16

91

要获取当前登录的用户:

System.getProperty("user.name");

要获取机器的主机名:

InetAddress.getLocalHost().getHostName();

为了回答问题的最后一部分,Java API说getHostName()将返回

该IP地址的主机名,或者如果安全检查不允许该操作,则为IP地址的文本表示形式。


赞成简洁明了地回答所有OP的原始问题。当然,这应该是公认的答案
Andy

1
同意@Andy-投票赞成所有观点的清晰简洁的回答。
Paul Eden 2014年

9

使用user.name不安全,因为可以伪造环境变量。您使用的方法很好,基于unix的操作系统也有类似的方法


因此,这只为窗口?有没有平台独立的方式来做到这一点?
Stuart R. Jefferys

7
系统属性不是环境变量。使用System.getenv(“ USER”)作为环境变量。用户仍然可以在java命令行上使用java -Duser.name = someoneelse来设置System.properties,因此仍然不安全
丹·卡特

“基于unix的操作系统也有类似的方法”:谢谢,我一直在寻找什么。那么这些操作系统的方法是什么?我的研究,目前进行了... ... :)使用“ whoami”?
pdem

抱歉,我的垃圾邮件来这里是在C中提供一种解决方案::stackoverflow.com/questions/1451825 / ...因此,基本上,我们必须将whoami或JNI与C代码“ getpwuid(getuid())”一起使用。不再有类UnixSystem。
2013年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.