Nom de la machine Java actuelle et utilisateur connecté?

153

Est-il possible d'obtenir le nom de l'utilisateur actuellement connecté (Windows / Unix) et le nom d'hôte de la machine?

Je suppose que c'est juste une propriété d'une classe d'environnement statique.

J'ai trouvé ceci pour le nom d'utilisateur

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

et ceci pour le nom de la machine:

import java.net.InetAddress;
...
String computerName;
...
try {
    computerName = InetAddress.getLocalHost().getHostName();
}

catch(Exception ex) {
    ...
}

Le premier est-il uniquement pour Windows?

Et que fera le second, si vous n'avez pas défini de nom d'hôte?

Omar Kooheji
la source
La NTSystemclasse n'existe que sur les Windowsdistributions JDK
BullyWiiPlaza

Réponses:

256

Pour obtenir l'utilisateur actuellement connecté:

System.getProperty("user.name"); //platform independent 

et le nom d'hôte de la machine:

java.net.InetAddress localMachine = java.net.InetAddress.getLocalHost();
System.out.println("Hostname of local machine: " + localMachine.getHostName());
cordellcp3
la source
1
Fonctionne-t-il System.getProperty("user.name"); à la fois sur Windows et Linux?
Poisson
5
Cependant, la user.namevaleur peut être falsifiée , elle ne doit donc pas être utilisée pour l'authentification.
Raedwald
14
System.getProperty ("user.name") n'est PAS un utilisateur actuellement connecté, c'est l'utilisateur sous le contexte de sécurité dont la JVM est en cours d'exécution.
rkosegi
1
Quant à ce que OP appelle «nom de la machine» ou «nom de l'ordinateur», cette réponse est incorrecte. Java n'a aucun moyen d'obtenir le "nom de l'ordinateur", c'est-à-dire le nom attribué à l'ordinateur au début du processus de démarrage et sans rapport avec le réseau. Tous les systèmes d'exploitation ont ce concept, mais malheureusement cette valeur n'est pas exposée en Java. Cependant, souvent - mais pas toujours - la méthode ci-dessus renverra effectivement le nom de l'ordinateur. Voir stackoverflow.com/a/40702767/1504556 pour plus d'explications.
peterh
91

Pour obtenir l'utilisateur actuellement connecté:

System.getProperty("user.name");

Pour obtenir le nom d'hôte de la machine:

InetAddress.getLocalHost().getHostName();

Pour répondre à la dernière partie de votre question, l' API Java indique que getHostName () retournera

le nom d'hôte de cette adresse IP, ou si l'opération n'est pas autorisée par le contrôle de sécurité, la représentation textuelle de l'adresse IP.

Bill le lézard
la source
Un vote favorable pour avoir répondu à toutes les questions originales du PO sauf une de manière claire et concise. Cela devrait sûrement être la réponse acceptée
Andy
1
D'accord avec @Andy - votez pour une réponse claire et concise à tous les points.
Paul Eden
9

L'utilisation user.namen'est pas sécurisée car les variables d'environnement peuvent être truquées. La méthode que vous utilisiez est bonne, il existe également des méthodes similaires pour les systèmes d'exploitation basés sur unix

phénix
la source
Alors c'est juste pour Windows? Existe-t-il un moyen indépendant de la plate - forme de le faire?
Stuart R. Jefferys
7
Les propriétés système ne sont pas des variables d'environnement. Utilisez System.getenv ("USER") pour les variables d'environnement. System.properties peut toujours être défini par l'utilisateur sur la ligne de commande java avec java -Duser.name = quelqu'un d'autre, donc toujours pas sécurisé
Dan Carter
"Il existe des méthodes similaires pour les OS basés sur Unix": Merci, ce que je cherchais. Alors, quelle est la méthode pour ces OS? mes recherches, me conduisent actuellement ... ici :) en utilisant "whoami"?
pdem
Désolé pour le spam, je viens ici pour donner une sorte de solution en C:: stackoverflow.com/questions/1451825/… Donc en gros, nous devons utiliser soit whoami ou JNI avec le code C "getpwuid (getuid ())" . Il n'y a plus de classe UnixSystem.
pdem
0

Pour obtenir le chemin de l'utilisateur actuellement connecté:

System.getProperty("user.home");
Swapnil1156035
la source