Frage Holen Sie sich Login-Benutzername in Java


Wie kann ich den Benutzernamen / Anmeldenamen in Java erhalten?

Dies ist der Code, den ich versucht habe ...

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());
}

Ich bekomme ein SecurityException wenn ich versuche, diesen Code auszuführen. Könnte mir bitte jemand sagen, ob ich in die richtige Richtung gehe, und mir helfen, das Problem zu verstehen.


75
2018-04-28 12:08


Ursprung


Antworten:


System.getProperty("user.name")

183
2018-04-28 12:11



in Unix:

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

in Windows:

new com.sun.security.auth.module.NTSystem().getName()

in Solaris:

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

30
2018-04-28 23:35



System.getProperty ("user.name") ist keine gute Sicherheitsoption, da diese Umgebungsvariable gefälscht werden könnte: C: \ set USERNAME = "Joe Doe" Java ... // gibt dir System.getProperty ("user.name") Du solltest tun:

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

JDK 1.5 und höher.

Ich benutze es in einem Applet und es muss signiert werden. Informationsquelle


15
2018-02-18 16:48



inspiriert von @newacct's Antwort, ein Code, der in jeder Plattform kompiliert werden kann:

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 ) );
}

14
2018-06-05 15:37



Mit JNA ist es einfach:

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
2017-11-18 15:53



Das 'setze Username = "Benutzername"' ist eine temporäre Überschreibung, die nur so lange existiert, wie das cmd-Fenster noch aktiv ist, sobald die Variable ausgeschaltet ist, verliert die Variable ihren Wert. Also ich denke das

System.getProperty ("Benutzer.Name");

ist immer noch ein kurzer und genauer Code zu verwenden.


2
2018-06-01 13:30



System.getenv().get("USERNAME");  - Arbeitet unter Windows!

In Umgebungseigenschaften haben Sie die Informationen, die Sie über Computer und Host benötigen! Ich sage es noch einmal! Funktioniert auf Windows!


1
2017-08-11 14:11