获取java中的登录用户名

时间:2009-04-28 12:08:04

标签: java username

如何在Java中获取用户名/登录名?

这是我试过的代码......

try{
    LoginContext lc = new LoginContext(appName,new TextCallbackHandler());
    lc.login();
    Subject subject = lc.getSubject();
    Principal principals[] = (Principal[])subject.getPrincipals().toArray(new Principal[0]);

    for (int i=0; i<principals.length; i++) {
        if (principals[i] instanceof NTUserPrincipal || principals[i] instanceof UnixPrincipal) {
            String loggedInUserName = principals[i].getName();
        }
    }

}
catch(SecurityException se){
    System.out.println("SecurityException: " + se.getMessage());
}

当我尝试运行此代码时,我得到SecurityException。有人可以告诉我,我是否正朝着正确的方向前进,并帮助我理解这个问题。

9 个答案:

答案 0 :(得分:199)

System.getProperty("user.name")

答案 1 :(得分:30)

在Unix中

new com.sun.security.auth.module.UnixSystem().getUsername()
Windows中的

new com.sun.security.auth.module.NTSystem().getName()
Solaris中的

new com.sun.security.auth.module.SolarisSystem().getUsername()

答案 2 :(得分:15)

System.getProperty(“user.name”)不是一个好的安全选项,因为该环境变量可能是伪造的: C:\ set USERNAME =“Joe Doe” java ... //将为您提供System.getProperty(“user.name”) 你应该这样做:

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

JDK 1.5及更高版本。

我在applet中使用它,必须签名。 info source

答案 3 :(得分:15)

@newacct 的回答启发,可以在任何平台上编译代码:

String osName = System.getProperty( "os.name" ).toLowerCase();
String className = null;
String methodName = "getUsername";

if( osName.contains( "windows" ) ){
    className = "com.sun.security.auth.module.NTSystem";
    methodName = "getName";
}
else if( osName.contains( "linux" ) ){
    className = "com.sun.security.auth.module.UnixSystem";
}
else if( osName.contains( "solaris" ) || osName.contains( "sunos" ) ){
    className = "com.sun.security.auth.module.SolarisSystem";
}

if( className != null ){
    Class<?> c = Class.forName( className );
    Method method = c.getDeclaredMethod( methodName );
    Object o = c.newInstance();
    System.out.println( method.invoke( o ) );
}

答案 4 :(得分:6)

使用JNA简单:

String username = Advapi32Util.getUserName();
System.out.println(username);

Advapi32Util.Account account = Advapi32Util.getAccountByName(username);
System.out.println(account.accountType);
System.out.println(account.domain);
System.out.println(account.fqn);
System.out.println(account.name);
System.out.println(account.sidString);

https://github.com/java-native-access/jna

答案 5 :(得分:2)

'set Username =“Username”'是一个临时覆盖,只有在cmd窗口仍处于运行状态时才会存在,一旦它被终止,变量就会丢失值。所以我认为

  

System.getProperty( “user.name”);

仍然是一个简短而精确的代码。

答案 6 :(得分:1)

System.getenv().get("USERNAME");   - 适用于Windows!

在环境属性中,您可以获得有关计算机和主机的信息!我再说一遍!适用于WINDOWS!

答案 7 :(得分:0)

以下是仅适用于WINDOWS的解决方案

如果应用程序(如Tomcat)作为Windows服务启动,则System.getProperty(“ user.name”)或System.getenv()。get(“ USERNAME”)返回启动该服务的用户而不是当前的登录用户名。

在Java 9中,NTSystem等类也将无法访问

因此Windows的解决方法:您可以使用 wmic ,因此必须运行以下命令

wmic ComputerSystem get UserName

如果可用,将返回以下形式的输出:

UserName
{domain}\{logged-in-user-name}

注意:对于Windows,您需要使用cmd / c作为前缀,因此以下是一个粗略的程序作为示例:

    Process exec = Runtime.getRuntime().exec("cmd /c wmic ComputerSystem get UserName".split(" "));
    System.out.println(exec.waitFor());
    try (BufferedReader bw = new BufferedReader(new InputStreamReader(exec.getInputStream()))) {
        System.out.println(bw.readLine() + "\n" + bw.readLine()+ "\n" + bw.readLine());
    }

答案 8 :(得分:0)

我在linux centos上测试过

Map<String, String> env = System.getenv();   
for (String envName : env.keySet()) { 
 System.out.format("%s=%s%n", envName, env.get(envName)); 
}

System.out.println(env.get("USERNAME"));