Pregunta Obtener nombre de usuario de inicio de sesión en java


¿Cómo puedo obtener el nombre de usuario / nombre de usuario en Java?

Este es el código que he intentado ...

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

Yo tengo un SecurityException cuando trato de ejecutar este código ¿Podría alguien decirme por favor si voy en la dirección correcta y ayudarme a comprender el problema?


75
2018-04-28 12:08


origen


Respuestas:


System.getProperty("user.name")

183
2018-04-28 12:11



en Unix:

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

en Windows:

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

en Solaris:

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

30
2018-04-28 23:35



System.getProperty ("user.name") no es una buena opción de seguridad ya que esa variable de entorno podría ser fingida: C: \ set USERNAME = "Joe Doe" java ... // le dará System.getProperty ("nombre.usuario") Deberías hacer:

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

JDK 1.5 y mayor.

Lo uso dentro de un applet, y tiene que estar firmado. fuente de información


15
2018-02-18 16:48



inspirado por @newacctLa respuesta de un código que se puede compilar en cualquier plataforma:

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



Usar JNA es simple:

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



los 'establecer nombre de usuario = "nombre de usuario"' es una anulación temporal que solo existe mientras las ventanas cmd estén aún activas, una vez que se elimina, la variable pierde valor. Entonces creo que

System.getProperty ("nombre.usuario");

sigue siendo un código breve y preciso para usar.


2
2018-06-01 13:30



System.getenv().get("USERNAME");  - funciona en Windows!

¡En las propiedades del entorno, tiene la información que necesita sobre la computadora y el host! ¡Estoy diciendo otra vez! Funciona en WINDOWS!


1
2017-08-11 14:11