Comment puis-je obtenir le nom d'utilisateur / nom de connexion en Java?
C'est le code que j'ai essayé ...
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());
}
J'obtiens un SecurityException
lorsque j'essaye d'exécuter ce code. Quelqu'un pourrait-il me dire si je vais dans la bonne direction et m'aider à comprendre le problème.
Réponses:
la source
user.name
nom de la propriété?sous Unix:
sous Windows:
sous Solaris:
la source
user.name
propriété doit simplement être nulle. Je suis d'accord avec @JinKim, n'écrivez pas de trucs dépendant du système d'exploitation.inspiré de la réponse de @newacct , un code qui peut être compilé dans n'importe quelle plateforme:
la source
com.sun
classes ne sont pas accessibles par défaut dans Java 9+. Cette solution ne fonctionnera pas pour cela.System.getProperty ("user.name") n'est pas une bonne option de sécurité car cette variable d'environnement pourrait être falsifiée: C: \ set USERNAME = "Joe Doe" java ... // vous donnera System.getProperty ("user. name ") Vous devez faire:
JDK 1.5 et supérieur.
Je l'utilise dans une applet, et il doit être signé. source d'informations
la source
com.sun.security.auth.module.NYSystem
plus haut dans le chemin de classe? Je ne sais pas si le runtime Java essaie de se prémunir contre de tels exploits, mais je ne pense pas qu'il y ait un moyen infaillible de le rendre `` sécurisé '' sauf en exécutant du code sur une boîte inaccessible au client potentiellement malveillant .Utiliser JNA c'est simple:
https://github.com/java-native-access/jna
la source
Le 'set Username = "Username"' est un remplacement temporaire qui n'existe que tant que la fenêtre cmd est toujours active, une fois qu'elle est tuée, la variable perd de sa valeur. Donc je pense que le
est toujours un code court et précis à utiliser.
la source
System.getenv().get("USERNAME");
- fonctionne sur Windows!Dans les propriétés de l'environnement, vous avez les informations dont vous avez besoin sur l'ordinateur et l'hôte! Je le répète! Fonctionne sur WINDOWS!
la source
System.getenv("username")
? :)Voici une solution pour WINDOWS UNIQUEMENT
Dans les cas où l'application (comme Tomcat) est démarrée en tant que service Windows, System.getProperty ("user.name") ou System.getenv (). Get ("USERNAME") renvoie l'utilisateur qui a démarré le service et non le nom d'utilisateur actuellement connecté.
Aussi dans Java 9, les classes NTSystem etc. ne seront pas accessibles
Donc, solution de contournement pour Windows: vous pouvez utiliser wmic , vous devez donc exécuter la commande ci-dessous
Si disponible, cela retournera la sortie du formulaire:
Remarque: pour Windows, vous devez utiliser cmd / c comme préfixe, voici donc un programme brut comme exemple:
la source