Jak mogę uzyskać nazwę użytkownika / nazwę logowania w Javie?
To jest kod, który wypróbowałem ...
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());
}
Otrzymuję, SecurityException
gdy próbuję uruchomić ten kod. Czy ktoś mógłby mi powiedzieć, czy zmierzam we właściwym kierunku i pomóc mi zrozumieć problem.
Odpowiedzi:
System.getProperty("user.name")
źródło
user.name
nazwy właściwości?w systemie Unix:
new com.sun.security.auth.module.UnixSystem().getUsername()
w systemie Windows:
new com.sun.security.auth.module.NTSystem().getName()
w Solarisie:
new com.sun.security.auth.module.SolarisSystem().getUsername()
źródło
user.name
właściwość powinna mieć wartość NULL. Zgadzam się z @JinKim, nie piszę rzeczy zależnych od systemu operacyjnego.zainspirowany odpowiedzią @newacct , kod, który można skompilować na dowolnej platformie:
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 ) ); }
źródło
com.sun
zajęcia nie są dostępne domyślnie w Java 9+. To rozwiązanie się nie sprawdzi.System.getProperty ("nazwa.użytkownika") nie jest dobrą opcją bezpieczeństwa, ponieważ ta zmienna środowiskowa może zostać sfałszowana: C: \ set USERNAME = "Joe Doe" java ... // da ci System.getProperty ("user. name ”) Powinieneś zrobić:
com.sun.security.auth.module.NTSystem NTSystem = new com.sun.security.auth.module.NTSystem(); System.out.println(NTSystem.getName());
JDK 1.5 i nowsze.
Używam go w aplecie i musi być podpisany. źródło informacji
źródło
com.sun.security.auth.module.NYSystem
modułu ładującego klasy lub niestandardowej implementacji wyższego w ścieżce klas? Nie wiem, czy środowisko wykonawcze Javy próbuje zapobiegać takim exploitom, ale nie sądzę, że będzie jakikolwiek niezawodny sposób, aby uczynić go `` bezpiecznym '', z wyjątkiem uruchomienia kodu na skrzynce niedostępnej dla potencjalnie złośliwego klienta .Korzystanie z JNA jest proste:
https://github.com/java-native-access/jna
źródło
„Set Nazwa =«Nazwa użytkownika»” jest tymczasowy przesłanianie że istnieje tylko tak długo, jak CMD okien jest wciąż w górę, raz jest zabijane, zmienna traci wartość. Więc myślę, że
to wciąż krótki i precyzyjny kod do użycia.
źródło
System.getenv().get("USERNAME");
- działa na oknach!We właściwościach środowiska masz potrzebne informacje o komputerze i hoście! Powtarzam! Działa na WINDOWS!
źródło
System.getenv("username")
? :)Poniżej znajduje się rozwiązanie TYLKO dla WINDOWS
W przypadkach, gdy aplikacja (taka jak Tomcat) jest uruchamiana jako usługa systemu Windows, System.getProperty („nazwa.użytkownika”) lub System.getenv (). Get („NAZWA UŻYTKOWNIKA”) zwraca użytkownika, który uruchomił usługę, a nie nazwa aktualnie zalogowanego użytkownika.
Również w Javie 9 klasy NTSystem etc nie będą dostępne
Więc obejście dla Windows: możesz użyć wmic , więc musisz uruchomić poniższe polecenie
Jeśli jest dostępny, zwróci dane wyjściowe w postaci:
Uwaga: W przypadku Windows musisz użyć cmd / c jako przedrostka, więc poniżej znajduje się prymitywny program jako przykład:
Process exec = Runtime.getRuntime().exec("cmd /c wmic ComputerSystem get UserName".split(" ")); System.out.println(exec.waitFor()); try (BufferedReader bw = new BufferedReader(new InputStreamReader(exec.getInputStream()))) { System.out.println(bw.readLine() + "\n" + bw.readLine()+ "\n" + bw.readLine()); }
źródło