2009-07-16 15 views
1

Ich schreibe gerade eine Java-Anwendung für die Verwendung mit einer Windows-Maschine mit einem ActiveDirectory Authhed. Die Anwendung muss im Grunde nur den Namen und den Hostnamen des Benutzers kennen. Ich weiß, esAbrufen des angemeldeten Benutzernamens und Hostnamens in Windows

System.getProperty("user.name")

und

java.net.InetAddress.getLocalHost().getHostName()

sind, aber ich bin nicht sicher, ob System.getProperty ("user.name") funktioniert korrekt mit der VM läuft auf Windows (I Gesucht google und fand viele Threads sagen es könnte nicht mit Windows arbeiten, da es etwas anders, abhängig von der Umgebungsvariablen (und ich bin derzeit nicht in der Lage, es zu testen [Ich bin mit Ubuntu und a rchLinux]).

Also fragte ich mich, ob es einen besseren und sichereren Weg gibt, damit umzugehen und stolperte über NTSystem. Aber NTSystem scheint unter Linux nicht verfügbar zu sein (was ich für die Entwicklung verwende), was - denke ich - auf dem nativen Windows-Code beruht.

Meine Frage wäre also: "Gibt es eine sichere Möglichkeit, den Namen des eingeloggten Benutzers in Windows abzurufen und wenn ja - wie würden Sie das erreichen?"

+0

user.name sollte plattformunabhängig sein, aber führen Sie ein Testprogramm aus und sehen Sie es sich selbst an. – akarnokd

+0

Aber jeder kann es über -Duser.name = XYZ überschreiben, so dass es inhärent unsicher ist –

+0

Meinst du "Linux als meine Entwicklungsumgebung zu verwenden", wenn du "in Linux" sagst? Siehe meine Antwort unten für einen Vorschlag. –

Antwort

1

user.name ist inhärent unsicher, weil es über -Duser.name=XYZ überschrieben werden kann. Dies könnte ein Problem für Sie sein, oder es ist möglicherweise nicht

Offensichtlich funktioniert NTSystem nicht auf Linux, aber Sie erwähnen, dass Sie eine GUI schreiben, die unter Windows ausgeführt werden soll. Versuchen Sie, den Windows-Benutzernamen des Benutzers zu überprüfen? Sie können dies über NTSystem Embedded in der Code, der auf dem Windows-Client, aber nicht (natürlich) Code, der unter der Linux OS ausgeführt läuft.

Oder versuchen Sie, sie auf einem Linux-Server zu validieren? Vielleicht haben Sie eine kerberos Domain, mit der Sie das machen könnten? (Dh, wenn es eine ist kerberos Domäne, dann können Sie eine sichere, authentifizierte Kommunikation zwischen Client und Server, um sicherzustellen, dass der Kunde die sie sagen, sie sind)

EDIT: ich durch die Tatsache verwechselt werden können Sie sagen, Sie schreiben eine Java App "in Linux". Ich habe damit einen Linux-Server und einen Windows-Client gemeint - aber vielleicht meinen Sie nur, dass Sie Lenux als Ihre Entwicklungsumgebung verwenden? In diesem Fall müssen Sie eine steckbare Identifizierung der Schreibschicht denken könnten, die Sie zwischen der Verwendung von NTSystem auf der Windows-Box und user.name zum Testen

+0

Ja, Linux ist meine Entwicklungsumgebung. Ich versuche nur, den Benutzer zu vermeiden.Name Eigentum, wie es ist - wie Sie sagten - inhärent unsicher. (Eigentlich sieht das Setup so aus: Linux Server mit Windows-Server-VirtualMachine (+ ActiveDirectory), eine Reihe von Windows-Clients. Ich habe eine Java-Anwendung auf dem Server laufen, eine C++ - Client läuft auf allen Windows-Maschinen und ein java-client läuft auf * bestimmten * windows-machines.Aber ich möchte auch vermeiden, die AD/Windows-Server-VM kontaktieren zu müssen) – Tedil

+0

So habe ich es gemacht: Ich habe die Windows Java jdk heruntergeladen und extrahiert com.sun.security. * von seinen libs. Ich habe sie dann als Bibliothek zu meinem Projekt ein importiertes NTSystem hinzugefügt. In der App selbst überprüfe ich, auf welchem ​​Betriebssystem es läuft, um zu bestimmen, welches System verwendet werden soll (entweder NTSystem oder UnixSystem). Dies kann und kann leicht vermieden werden, indem NTSystem und UnixSystem eine Schnittstelle implementieren, die 'getUserName' und ähnliche Methoden bereitstellt, so dass Sie ein generischeres System verwenden können (z. B. "GenericSystem" oder "AbstractSystem"). Wäre eine nette Ergänzung zu openJDK, denke ich;) – Tedil

1

Verwendung JNA hat com.sun.platform.jna.win32 eine Reihe von Methoden wechseln Um dies zu tun wickeln Sie die Win32-API. Versuchen Sie Advapi32Util.getUserName oder Kernel32Util.getUserNameEx.

Verwandte Themen