¿Cómo puedo obtener el nombre de usuario / nombre de inicio de sesión en Java?
Este es el código que he probado ...
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());
}
Me sale un SecurityException
cuando intento ejecutar este código. ¿Podría alguien decirme si voy en la dirección correcta y ayudarme a comprender el problema?
Respuestas:
fuente
user.name
nombre de la propiedad?en Unix:
en Windows:
en Solaris:
fuente
user.name
propiedad debería ser nula. Estoy de acuerdo con @JinKim, no escribas cosas que dependan del sistema operativo.inspirado en la respuesta de @newacct , un código que se puede compilar en cualquier plataforma:
fuente
com.sun
clases no son accesibles de forma predeterminada en Java 9+. Esta solución no funcionará.System.getProperty ("user.name") no es una buena opción de seguridad ya que esa variable de entorno podría ser falsificada: C: \ set USERNAME = "Joe Doe" java ... // le dará System.getProperty ("user. name ") Deberías hacer:
JDK 1.5 y superior.
Lo uso dentro de un subprograma y tiene que estar firmado. fuente de información
fuente
com.sun.security.auth.module.NYSystem
nivel superior en la ruta de clases? No sé si el tiempo de ejecución de Java intenta prevenir tales exploits, pero no creo que haya ninguna forma infalible de hacerlo 'seguro' excepto ejecutando código en una caja que es inaccesible para el cliente potencialmente malicioso. .Usar JNA es simple:
https://github.com/java-native-access/jna
fuente
El 'set Username = "Username"' es una anulación temporal que solo existe mientras las ventanas de cmd aún estén activas, una vez que se elimina, la variable pierde valor. Entonces creo que el
sigue siendo un código breve y preciso de utilizar.
fuente
System.getenv().get("USERNAME");
- ¡Funciona en Windows!En las propiedades del entorno, tiene la información que necesita sobre la computadora y el host. ¡Lo digo de nuevo! ¡Funciona en WINDOWS!
fuente
System.getenv("username")
? :)A continuación se muestra una solución SOLO para WINDOWS
En los casos en que la aplicación (como Tomcat) se inicia como un servicio de Windows, System.getProperty ("user.name") o System.getenv (). Get ("USERNAME") devuelven el usuario que inició el servicio y no el actual nombre de usuario registrado.
También en Java 9, las clases NTSystem, etc.no serán accesibles
Entonces, solución para Windows: puede usar wmic , por lo que debe ejecutar el siguiente comando
Si está disponible, esto devolverá la salida del formulario:
Nota: Para Windows, debe usar cmd / c como prefijo, por lo que a continuación se muestra un programa básico como ejemplo:
fuente