Batch-Scripting: Abrufen der UUID der Netzwerkverbindung

1021
Klinghust

Kurz gesagt: Was ich brauche, ist eine Möglichkeit, die UUID der Netzwerkverbindung "xyz" aus einer Batchdatei zu finden.

Ich versuche, ein Skript einzurichten, das den aktuellen Benutzer mit einer geplanten Aufgabe belegt. Ich habe vor, dieses Skript an mehrere Personen zu senden und muss daher vollautomatisch sein. Diese Task muss nur ausgeführt werden, wenn eine Verbindung zu einem bestimmten Netzwerk besteht.

Was habe ich getan:

  • Die gewünschte Aufgabe wurde erstellt Task Schedulerund exportiert, um sie als Vorlage für die Aufgabe zu verwenden, die mit dem Skript importiert werden soll.
  • Legen Sie fest, dass das Skript bestimmte Werte in der Vorlage durch benutzerspezifische Details ersetzt.

Mein Problem ist das Finden der UUID, die der Taskplaner beim Setzen verwendet Start only if the following network connection is availiable. Von dem, was ich gefunden habe, ist dies nicht die gleiche UUID wie die Netzwerkschnittstellen-UUID. Die exportierte XML-Datei für diese Option sieht folgendermaßen aus:

<NetworkSettings> <Name>AndoidAP</Name> <Id></Id> </NetworkSettings> 

In dem Beispiel habe ich AndroidAP verwendet, ein kabelloses Gerät. Der wirkliche Fall wäre eine Kabelverbindung. Weiß nicht, ob das einen Unterschied macht?

Scheduler GUI

Jede Hilfe oder Anregung wäre sehr dankbar!

1
Ich dachte, ich hätte eine Lösung in Reichweite, als ich die Registrierungsschlüssel für die Netzwerkprofile in der Registrierung fand. Meine Hoffnungen waren jedoch zerschlagen, als ich herausfand, dass ich (wahrscheinlich aufgrund der Gruppenrichtlinie) keine Schlüssel innerhalb von HKEY_LOCAL_MACHINE \ SOFTWARE abfragen darf Klinghust vor 7 Jahren 0
@Facebook Danke für deine Antwort! Ich habe das noch nicht abgeschlossen. Ich denke, das Standardgateway bleibt ziemlich statisch. Woher??? :) Ich habe festgestellt, dass "wevtutil" die GUID auflistet, wenn sie nicht als Text formatiert ist (dh als XML formatiert). Das Arbeiten mit Strings in Batches ist so schmerzhaft, dass ich an einem .vbs-Skript arbeite, um die GUID aus der Ausgabe von wevtutil zu extrahieren. Dieses VBS-Skript, das ich aus dem Batch-Skript erstellen und löschen möchte, sobald es fertig ist. Ich werde meine Lösung posten, sobald ich Zeit habe, sie abzuschließen. Klinghust vor 7 Jahren 0
Eine weitere Frage: Ist der Hauptzweck Ihrer Aufgabe hier, sicherzustellen, dass diese Aufgabe nur ausgeführt wird, wenn sie mit einem bestimmten Netzwerk verbunden ist? Ist dies das Hauptziel, unabhängig von der UUID, die Sie über ein CLI- und Batch-Skript oder ein VBS-Skript erfassen? Ich habe eine einfache Idee, die vielleicht helfen kann, aber ich möchte, wenn möglich, zuerst von Ihnen hören. Pimp Juice IT vor 7 Jahren 0
@Facebook Ja, das ist das Hauptziel, da das Skript einen vom Benutzer angegebenen Ordner auf eine Netzwerkfreigabe spiegeln soll. Wenn das Skript in einem anderen Netzwerk ausgeführt werden sollte, könnte es möglicherweise den Ordner auf einem fremden Computer spiegeln. Klinghust vor 7 Jahren 0
Okay, ich habe eine Idee, ich werde mit einer Bestätigungsarbeit spielen, da ich darüber nachdenke und dann zumindest eine Antwort für Sie schreibe. Ich gehe davon aus, dass diese Netzwerkfreigabe nur in diesem Netzwerk als eine Art UNC-Pfad wie "\\ Server \ Freigabe" zu korrekt ist. Ich teste einige Ideen mit Batch, um zu sehen, ob es einige Überprüfungen gibt, bevor das Skript ausgeführt wird. Pimp Juice IT vor 7 Jahren 0
@Facebook Richtig. Klinghust vor 7 Jahren 0

2 Antworten auf die Frage

1
Pimp Juice IT

Deine Anforderungen

Im Wesentlichen haben Sie eine Aufgabe, die Sie nur ausführen möchten, wenn bestimmte Bedingungen TRUE sind :

  1. Der Prozess muss nur ausgeführt werden, wenn er an ein bestimmtes Netzwerk angeschlossen ist
  2. Der Prozess muss nur ausgeführt werden, wenn eine bestimmte Dateifreigabe verfügbar ist

Möglicherweise

Sie könnten eine IF- Logik verwenden und einfach den Status der Bedingungen prüfen und entsprechend handeln, ob Sie die restliche definierte Logik " beenden " oder " weiterbearbeiten " möchten.

Im Wesentlichen wird dies. . .

  1. ping das Standard-Gateway über seine IP-Adresse
  2. Überprüfen Sie den Arp- Cache auf die MAC-Adresse des an FindStr weitergeleiteten Standard-Gateways
    • Wenn die MAC-Adresse dann nicht gefunden wirdEXIT
    • Wenn die MAC-Adresse gefunden wird , fahren Sie mit der Verarbeitung fort
  3. Überprüfen Sie, ob die UNC-Freigabe vorhanden ist
    • Wenn die UNC-Freigabe dann nicht vorhanden istEXIT
    • Wenn die UNC-Freigabe existiert , fahren Sie mit der Verarbeitung fort, d. H. Der Rest der Logik

Voraussetzungen

  1. Rufen Sie die IPv4-Adresse des Standard-Gateways vom ipconfigBefehl ab

  2. Rufen Sie die physische Mac-Adresse von der IP-Adresse des Standard-Gateways ab

    • Führen Sie einen pingBefehl für die IP-Adresse des Standardgateways aus
    • Führen Sie einen arp -aBefehl aus, und notieren Sie sich die Physical AddressIP-Adresse des Standard-Gateways, deren IP-Adresse übereinstimmt


Batch-Skript

Offensichtlich sind die GatewayIP=, GWMacAddr=und FolderShr=Variablenwerte müssen mit genauen Werte eingestellt werden für diese wie erwartet-I zu arbeiten, getestet und bestätigt es von meiner Seite habe.

@ECHO ON   SET GatewayIP=192.168.1.254 SET GWMacAddr=e1-c3-5b-ed-4d-61 SET FolderShr=\\machinename\sharename  ping -n 02 %GatewayIP% arp -a | findstr /c:"%GWMacAddr%"  IF NOT %ERRORLEVEL%==0 EXIT IF NOT EXIST "%FolderShr%" EXIT  <Rest of batch logic here since both checks above passed> EXIT 


Weitere Ressourcen

Danke für die ausführliche Anleitung! Ordentlicher Ansatz. Der einzige Nachteil, den ich sehen kann, ist, dass das Cmd-Fenster bei einer Verbindung mit einem anderen Netzwerk während der Überprüfungen kurz auf dem Bildschirm angezeigt wird. Außerdem weiß ich nicht warum, aber die IP-Adresse wird auch nach dem Ping nicht in `arp -a` angezeigt. Klinghust vor 7 Jahren 0
@Klinghust Wenn der Ping antwortet, sollten IP und MAC angezeigt werden. Stellen Sie jedoch sicher, dass Sie cmd.exe als Administrator ausführen. Sie können dies auf ein paar verschiedene Arten ausführen, von denen ich weiß, wie sie es tun und die auch nicht komplex sind. Sehen Sie sich meine Antwort hier an: https://superuser.com/questions/957267/how-to-disable-automatic-reboots-in-windows-10/1208716#1208716 und schauen Sie sich '# 2' an (erstellen Sie das VBS-Skript). , "# 9", "# 10" und "# 11" (Auswahl von Aktionsoptionen) für meine ursprüngliche Idee, ausgeblendet auszuführen, da ich im Taskplaner die Option "Nur ausführen" haben muss, wenn der Benutzer angemeldet ist ` Pimp Juice IT vor 7 Jahren 0
Wenn der Ping nicht antwortet, sollte die IP-Adresse bzw. der MAC beim Testen des Verhaltens auftauchen. Möglicherweise wird ein Run als Admin-Problem ausgeführt, wenn es nicht einfach wie erwartet funktioniert und der DW-Ping nicht reagiert. Pimp Juice IT vor 7 Jahren 0
Der Ping-Befehl antwortet `Reply from 10.250.30.27: Bytes = 32 Zeit = 24 ms TTL = 121 Ping-Statistik für 10.250.30.27: Pakete: Gesendet = 4, Empfang = 4, Verlust = 0 (0% Verlust)` Aber noch keine Spur davon in `arp -a`. Gleiche Ergebnisse bei der Ausführung von cmd als admin. Klinghust vor 7 Jahren 0
@Klinghust Wie sieht deine Netzwerktopographie damit aus? Kannst du erklären, wie die Maschine, auf der du dies ausführst, von Gesprächen mit diesem Gateway für alle möglichen Hops ausgeht, die es machen muss? Ist dies eine physische Maschine oder eine virtuelle Maschine? Ich versuche, einen anderen Weg zu finden, aber wenn der freigegebene Ordner nur dann verfügbar ist, wenn er mit diesem Netzwerk verbunden ist, dann können Sie einfach die "IF NOT EXIST" -Verzeichnisse "% FolderShr%" EXIT "einstellen und verwenden nicht einmal sorgen um den arp-cache. Vielleicht wäre die bloße Antwort auf den Ping-Befehl mit Erfolg und die Freigabeprüfung besser? Pimp Juice IT vor 7 Jahren 0
Ich bin mir bezüglich der Netzwerktopologie nicht sicher, da ich nicht in der IT bin. Aber was ich mit "tracert" finden kann, scheint, dass sich dieser Server außerhalb des Hauses befindet (8hops). Meine Sorge ist, dass, wenn jemand eine Verbindung zu einem anderen Netzwerk herstellt und es einen Server mit demselben Namen gibt, die Dateien darauf kopiert werden. Deshalb möchte ich die GUID, da sie für das Netzwerk eindeutig ist. Klinghust vor 7 Jahren 0
@Klinghust Wenn Sie eine versteckte Dummy-Freigabe mit einem eindeutigen Namen erstellen und bestätigen, dass sie verfügbar ist, würde dies meiner Meinung nach ausreichen. Unabhängig davon, welches Skript Sie für den Job verwenden, verweisen Sie auch auf ein Skript auf der Netzwerkfreigabe. Wenn also jemand all dies in Ihrer Umgebung hat, haben Sie wahrscheinlich nicht das Skript in dem UNC-Pfad, den Sie dafür verwenden . Wenn es sich also um lokale Rechnerskripts handelt, die nur im Netzwerk ausgeführt werden, machen Sie die Skripts nur von demselben Netzwerk aus zugänglich. Wenn das Skript nicht verfügbar ist, wird der Job ausgeführt, das Skript wird jedoch nicht ausgeführt. Pimp Juice IT vor 7 Jahren 0
@Klinghust Was die UUID, die GUID oder was auch immer betrifft, ich denke, Windows OS speichert einen Namen, der für die Netzwerke eindeutig ist, für die es eine Verbindung herstellt, und dies ist nur pro Computer. Die UUID überträgt also nicht wirklich das Netzwerk, sondern das Windows-Betriebssystem speichert diese und erstellt die UUID pro Maschine pro Netzwerk, sodass dieselbe Netzwerk-UUID auf PC1 und PC2 nicht dieselbe ID-Nummer hat. Ich muss mehr darüber nachlesen, aber aus dem, was ich beim schnellen Lesen habe, scheint das der Fall zu sein. Pimp Juice IT vor 7 Jahren 0
Ich kann IP nicht als Bedingung verwenden, da ich nicht dafür sorgen kann, dass es gleich bleibt, da Server gelegentlich ausgetauscht werden. Ich kann den Namen des Servers verwenden, da die IT den Link immer in "net use" aktualisiert, wenn sich der Name ändert. Ihre Annahmen bezüglich GUID / UUID sind soweit ich richtig erlebt habe. Deshalb muss ich es automatisch von dem PC erhalten, auf dem das Skript ausgeführt wird, das die geplante Aufgabe hinzufügt. Klinghust vor 7 Jahren 0
Führen Sie das Batch-Skript über den Task-Scheduler aus? Wenn dies der Fall ist, rufen Sie das Programm / Skript nicht auf ein lokales Batch-Skript "C: \ scripts \ process.cmd", sondern rufen Sie es über "\\ server \ share \ scripts \ process.cmd" auf. Die IP-Adresse des DG sollte sich nicht so oft ändern, denke ich nicht, aber Server und PCs, die ich verstehe, sind eine andere Geschichte. In einem anderen Netzwerk mit sogar derselben IP-Adresse wie der DG ist dies sicher und selbst wenn ein Server mit denselben Freigabenamen eingerichtet ist, wird wahrscheinlich kein Stapelskript mit demselben Namen die Logik ausführen. Ich denke, eine einfache Lösung wie diese wäre gut. Pimp Juice IT vor 7 Jahren 1
Ich denke, das Skript auf dem Server zu platzieren wäre eine anständige Lösung. Ich könnte am Ende tatsächlich dafür sorgen, dass die GUID in die geplante Aufgabe eingefügt wird :) Vielen Dank für all Ihre Mühe !! Klinghust vor 7 Jahren 0
0
Klinghust

Rufen Sie die GUID der Netzwerkverbindung ab

Dadurch wird die GUID eines bestimmten Netzwerknamens abgerufen. Da die GUID für jeden Computer eindeutig ist, ist diese GUID nicht die GUID für das Netzwerk, sondern die eindeutige Kennung, mit der der Computer das Netzwerk identifiziert. Mir sind derzeit die Kriterien, die Windows zur Identifizierung des Netzwerks verwendet, nicht bekannt, aber im Moment erfüllt dies meine Anforderungen. In meinem Fall wäre die Aufforderung nicht erforderlich, da der Netzwerkname eine Konstante ist (ändert sich nur, wenn / wenn das Unternehmen den Namen ändert ).

Was das macht, ist:

  1. Erzeugt einige temporäre Ordner.
  2. Benutzer nach dem Netzwerknamen fragen. Den aktuellen Netzwerknamen finden Sie hier:See network name here
  3. Rufen Sie Protokolleinträge ab, die den Netzwerknamen enthalten.
  4. Erzeugt ein VBS-Skript.
  5. Führt das VBS-Skript aus, mit dem die GUID aus den Protokolleinträgen extrahiert und ein Popup mit der GUID angezeigt wird.
  6. Bereinigen Sie temporäre Dateien und Ordner.

Update: Lol. Vergessen, das Skript einzufügen. Auf geht's:

Skript:

@ECHO OFF CLS  REM Make temp folder to place temporary files in IF NOT EXIST "%tmp%\TKH\Mirror_Folders" MD "%tmp%\TKH\Mirror_Folders"  REM Ask user for name of network to find GUID for ECHO wscript.echo inputbox(WScript.Arguments(0),WScript.Arguments(1)) >"%tmp%\TKH\Mirror_Folders\NetworkName.vbs" FOR /f "tokens=* delims=" %%a IN ('cscript //nologo "%tmp%\TKH\Mirror_Folders\NetworkName.vbs" "Enter the name of the network" "Select network"') DO SET NetworkToSearchFor=%%a  REM Add 'Name'> to %NetworkToSearchFor% to filter out false results SET SearchString="'Name'^^^>%NetworkToSearchFor%"  REM Get log entry for networkname FOR /f "delims=" %%i IN ('wevtutil qe Microsoft-Windows-NetworkProfile/Operational /q:"Event[System[(EventID=10000)]]" /c:100 /rd:true /f:xml ^| FINDSTR /R "%SearchString%"') DO ( ECHO %%i>>"%tmp%\TKH\Mirror_Folders\Log entries.txt" ) REM Make VBS-script to get GUID ( ECHO. 'Creates local variables ECHO. Private Arg, objInputFile, tmpStr ECHO. 'Populate array with arguments ECHO. 'Arg^(0^): filepath^+filename ECHO. Set Arg = WScript.Arguments ECHO. ECHO. Set objInputFile = CreateObject^("Scripting.FileSystemObject"^).OpenTextFile^(Arg^(0^)^) ECHO. tmpStr = objInputFile.ReadLine ECHO. ECHO. FirstCharacterToGet = InStr^(tmpStr, "<Data Name='Guid'>"^)^+18 ECHO. NumberOfCharactersToGet = 38 ECHO. GUID = mid^(tmpStr, FirstCharacterToGet, NumberOfCharactersToGet^) ECHO. WScript.Echo GUID )>"%tmp%\TKH\Mirror_Folders\Get GUID.vbs"  REM Call VBS-script to get GUID FOR /F "usebackq tokens=*" %%r in (`CSCRIPT "%tmp%\TKH\Mirror_Folders\Get GUID.vbs" "%tmp%\TKH\Mirror_Folders\Log entries.txt"`) DO SET GUID=%%r ECHO %GUID% mshta "javascript:alert('Your networks GUID is:\n%GUID%');close()"  REM Clean up RD /Q /S "%tmp%\TKH\ 

Speichern Sie dies als "get GUID.cmd".