web-dev-qa-db-ja.com

javaでログインユーザー名を取得します

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が表示されます。誰かが私が正しい方向に向かっているかどうかを教えてくれて、問題を理解するのを助けてくれませんか?.

83
George Profenza
System.getProperty("user.name")
202
dfa

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()
30
newacct

@ 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 ) );
}
15
celsowm

System.getProperty( "user.name")は、環境変数が偽造される可能性があるため、適切なセキュリティオプションではありません。C:\ set USERNAME = "Joe Doe" Java ... //システムを提供します.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以降。

アプレット内で使用し、署名する必要があります。 情報源

15
pdjota

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

6
ANTARA

'set Username = "Username"'は、cmdウィンドウがまだ起動している場合にのみ存在する一時的なオーバーライドであり、一度削除されると変数は値を失います。だから私は思う

System.getProperty( "user.name");

まだ使用する短く正確なコードです。

2
Newtoxton

System.getenv().get("USERNAME");-Windowsで動作します!

環境プロパティには、コンピューターとホストについて必要な情報があります!私は再び言っています! WINDOWSで動作します!

1
Dragos Roban