Wie finde ich meine "Computerbeschreibung" in einer Java-Anwendung unter Windows und / oder Mac?

8

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

    
Mattijs 14.10.2010, 14:41
quelle

10 Antworten

3

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 :

%Vor%

(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:

%Vor%

(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:

%Vor%     
Jeremy W. Sherman 23.10.2010, 07:55
quelle
4

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%     
Balaram 23.10.2010 17:07
quelle
3

Sie sollten wissen, dass ein einzelner Computer mehrere DNS-Namen haben kann.

Versuchen Sie dies, um einen Namen zu erhalten:

  • Rufen Sie java.net.NetworkInterface.getNetworkInterfaces() auf, um alle Netzwerkschnittstellen zu erhalten;
  • Rufen Sie für jedes zurückgegebene NetworkInterface java.net.NetworkInterface.getInetAddresses() auf, um alle IP-Adressen einer Schnittstelle zu erhalten;
  • Rufen Sie für jede zurückgegebene IP-Adresse java.net.InetAddress.getCanonicalHostName() auf, um den zugehörigen Hostnamen zu erhalten;
  • Wählen Sie einen der Hostnamen.
Steve Emmerson 14.10.2010 18:50
quelle
3

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.

    
Qwerky 20.10.2010 14:11
quelle
3
  1. Holen Sie sich com4j (direkter Download-Link) Dies ist eine Java-Bibliothek, an die Aufrufe gesendet werden COM.

  2. Entpacken Sie und im Beispielordner Sie findet eine WMI     Probe.

  3. Ändern Sie Main.java in das folgende und Sie sollten eingestellt werden.

%Vor%     
renick 24.10.2010 19:01
quelle
2

Wie wäre es mit InetAddress . %Co_de% ?

%Vor%

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.

    
Andy 18.10.2010 16:02
quelle
1

Sind Sie sicher, dass Sie nicht direkt hinter der Umgebungsvariable COMPUTERNAME sind, die Sie in diesem Steuerungsfenster sehen?

    
Michael Goldshteyn 14.10.2010 14:45
quelle
1

"Pure" Computername für MAC:

%Vor%     
paulo roberto medeiros 27.02.2012 23:15
quelle
0

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: "

anzeigt

Also mit:

%Vor%

Sie sollten in der Lage sein, den Namen des Localhosts zu erhalten, wie Sie wollen. Ich hoffe, das hilft.

ref:

'

    
posdef 18.10.2010 16:57
quelle
0

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

zurückgegeben %Vor%     
Mattijs 20.10.2010 13:05
quelle

Tags und Links