Ich habe mich bemüht, die "Beschreibung" des Computers zu finden, auf dem meine Java-Anwendung läuft.
Was ich suche, ist der Name, der für DNS verwendet wird, wenn ich meinen Computer im lokalen Netzwerk annonciere ("iMac Mattijs" in den Screenshots unten).
Unter Windows XP finden Sie diesen Namen hier: Systemsteuerung - & gt; System - & gt; Computername - & gt; Computerbeschreibung.
Unter Mac OS 10.6 finden Sie diesen Namen hier: Systemeinstellungen - & gt; Teilen - & gt; Computername
Die folgenden Methoden liefern nicht den gesuchten Namen. Schau dir diesen Code an:
%Vor%Unter Windows wird Folgendes gedruckt:
%Vor%Am Mac bekomme ich:
%Vor%Aber ich suche den ganzen String "iMac Mattijs".
Irgendwelche Hinweise wären sehr willkommen!
Danke, Mattijs
Mac OS X speichert den Computernamen im dynamischen Systemkonfigurationsspeicher. Die Standardschnittstelle dazu ist über das Systemkonfigurationsframework. Das Befehlszeilen-Tool, das diese API ausführt, ist scutil
:
(Ich habe meinen Computernamen vorübergehend in Leerzeichen und Interpunktionszeichen geändert, damit er sich leicht vom Hostnamen unterscheiden lässt, was in diesem Fall etwa hermes-is-awesome.local
wäre.)
Sie können sehr einfach mit JNI damit interagieren:
%Vor% Jetzt javac FILE.java
und dann javah SCDynamicStore
. Dies erzeugt SCDynamicStore.h
. Kopiere dies in SCDynamicStore.c
und editiere es zum Lesen:
(Sie könnten den Code vereinfachen, indem Sie gebührenfreie Obj-C-Bridging verwenden und -[NSString UTF8String]
nutzen. Es könnte wünschenswert sein, in einigen Fehlerfällen eine Ausnahme auszulösen, anstatt nur NULL
zurückzugeben.)
Sie können das dann mit clang -shared -I/Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/JavaVM.framework/Headers/ -framework CoreFoundation -framework SystemConfiguration SCDynamicStore.c -o libSCDynamicStore.dylib
kompilieren.
Nun, vorausgesetzt, libSCDynamicStore.dylib
ist mit LD_LIBRARY_PATH
identisch, was es ist, wenn es im aktuellen Verzeichnis ist, können Sie die Anwendung ausführen:
Hier ist, was ich bei einigen Experimenten gefunden habe. Die Computerbeschreibung wird im Registrierungsschlüssel gespeichert
HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Dienste \ LanManServer \ Parameters \ srvcomment
Also, wenn wir irgendeine API haben, die wir verwenden können, um die reg-Schlüsselwerte zu erhalten, können wir es herausfinden.
Außerdem wurde der folgende Link gefunden, der eine gute Klasse zum Abfragen von reg-Schlüsselwerten bietet:
Und unter Verwendung der Klasse WinRegistry, die auf der obigen Seite angegeben ist, konnte ich die Computerbeschreibung mit dem folgenden Code erfolgreich finden:
%Vor%Sie sollten wissen, dass ein einzelner Computer mehrere DNS-Namen haben kann.
Versuchen Sie dies, um einen Namen zu erhalten:
java.net.NetworkInterface.getNetworkInterfaces()
auf, um alle Netzwerkschnittstellen zu erhalten; NetworkInterface
java.net.NetworkInterface.getInetAddresses()
auf, um alle IP-Adressen einer Schnittstelle zu erhalten; java.net.InetAddress.getCanonicalHostName()
auf, um den zugehörigen Hostnamen zu erhalten; Ich glaube nicht, dass es möglich ist, das zu erreichen, ohne dass man nativ wird. Wenn Sie eine Java-Bibliothek finden, die Ihnen Zugriff auf WMI gibt, können Sie sie im Objekt Beschreibung des Feldes Win32_OperatingSystem abrufen.
Googeln gibt ein paar wahrscheinliche Optionen;
Ссылка
Sehr einfach (und kostenlos) wenn ein wenig hacky. Scheint zu funktionieren, indem man .vbs-Skripte in ein temporäres Verzeichnis schreibt und sie mit Runtime.getRuntime().exec()
und cscript.exe aufruft.
Ссылка
Java COM-Brücke.
Ich denke, die Microsoft JVM enthält native Bits, die ebenfalls dazu beitragen können.
Wie wäre es mit InetAddress
. %Co_de% ?
Bearbeiten: Also die obige Antwort ist offensichtlich nicht das, was Sie wollten. Allerdings ... Das Projekt MAST bietet eine Methode zum Abrufen der Computerbeschreibung. Siehe getHostName()
. SysUtils
. Diese Methode ist betriebssystemspezifisch. Die Projekthomepage sagt, dass eine OSX-Version in Arbeit ist.
Sind Sie sicher, dass Sie nicht direkt hinter der Umgebungsvariable COMPUTERNAME sind, die Sie in diesem Steuerungsfenster sehen?
Diese Computerbeschreibung / Name ist der Hostname des lokalen Hosts. Sie können dies überprüfen, indem Sie die Terminal-Eingabeaufforderung überprüfen, die normalerweise ComputerName:CurrentDirectory User$
entsprechend einer Standard-Bash-Eingabeaufforderung export PS1="\u@\h\w: "
Also mit:
%Vor%Sie sollten in der Lage sein, den Namen des Localhosts zu erhalten, wie Sie wollen. Ich hoffe, das hilft.
ref:
'
Alles klar, ich habe einen Weg gefunden, das selbst zu machen, aber nur unter Mac OS. Das Kopfgeld ist immer noch offen für Leute, die einen Weg finden können, meine Frage auf Windows zu beantworten.
Beim Ausführen dieser App wird Computer Description: iMac Mattijs
Tags und Links java networking dns system