Auslesen einer TXT und aus einem bestimmten Abschnitt Inhalte als Variable schreiben
Ich bastle gerade an einem simplen Skript, über welches Clients bei der Anmeldung via ProduKey.exe ihre Lizenz-Infos in eine CSV schreiben.
Hallo
Also was wird benötigt: ich brauche alle Windows-Lizenzkeys und Office-Lizenzkeys, sowie die verwendete Version. Zunächst mal ganz einfach, das Tool "ProduKey" lässt sich auch per CMD ansprechen, gesagt getan, ich lasse über den Output-Schalter Text-Dateien ausgeben. Die möchte ich dann gleich automatisch auslesen und in eine CSV schreiben lassen.
Ich bin schon so weit, dass ich das Betriebssystem auslesen kann. Bei Office stellt sich jedoch die Problematik dar, dass hier zu viele Werte stehen können und ich die falschen Variablen schreibe. Zur Erläuterung zunächst hier der Aufruf der EXE:
Es wird in diesem Fall forciert, dass nur der Key für alles, was mit Office zu tun hat, ausgelesen und im %Temp%-Ordner in die licence.txt geschrieben wird.
Das sieht dann im ungünstigsten Falle so aus:
Nun will ich aber primär erst einmal den Key für Office 2012 auswerten, also in etwa: Finde "Product Name : Microsoft Office Single Image 2010" und gib mir die darauf folgende Zeile "Product Key" aus (zusammenschnippeln bekomm ich dann selbst hin).
Was wäre die beste Herangehensweise, dass ich nicht z. B. die Visio-Lizenz oder die Access-Lizenz oder ähnliches erwische, sondern wirklich nur "Microsoft Office Single Image 2010"?
Hier noch der Auszug, wie ich das beim Auslesen des Betriebssystems gelöst habe:
Damit wird die TXT für das OS erstellt.
Und hier wird sie nun ausgelesen und als Variable geschrieben:
Das Schreiben in die CSV ist dann natürlich kein Hexenwerk mehr, wenn ich einmal die korrekte Variable habe. Dass die Rechner das nicht doppelt machen, stelle ich sicher, indem ich sie beim erfolgreichen Schreiben in die CSV anschließend eine Prüfdatei in einem öffentlichen Ordner erstellen lasse (%computername%.txt). Sollte ich wieder eine Auswertung wollen, muss ich dann nur die .txt's löschen und es wird wieder in die CSV geschrieben. Das aber nur am Rande.
Hoffe, ich konnte die Problematik gut genug erklären
Hallo
Also was wird benötigt: ich brauche alle Windows-Lizenzkeys und Office-Lizenzkeys, sowie die verwendete Version. Zunächst mal ganz einfach, das Tool "ProduKey" lässt sich auch per CMD ansprechen, gesagt getan, ich lasse über den Output-Schalter Text-Dateien ausgeben. Die möchte ich dann gleich automatisch auslesen und in eine CSV schreiben lassen.
Ich bin schon so weit, dass ich das Betriebssystem auslesen kann. Bei Office stellt sich jedoch die Problematik dar, dass hier zu viele Werte stehen können und ich die falschen Variablen schreibe. Zur Erläuterung zunächst hier der Aufruf der EXE:
"\\Pfad\ProduKey.exe" /WindowsKeys 0 /OfficeKeys 1 /IEKeys 0 /SQLKeys 0 /ExchangeKeys 0 /ExtractEdition 0 /stext > %temp%\licence.txt
Es wird in diesem Fall forciert, dass nur der Key für alles, was mit Office zu tun hat, ausgelesen und im %Temp%-Ordner in die licence.txt geschrieben wird.
Das sieht dann im ungünstigsten Falle so aus:
==================================================
Product Name : Microsoft Access 2002 Runtime
Product ID : 11111-000-11111111-22222
Product Key : XXXXX-XXXXX-XXXXX-XXXXX-XXXXX
Installation Folder :
Service Pack :
Computer Name : PC-Name
Modified Time : 21.05.2012 11:29:27
==================================================
==================================================
Product Name : Microsoft Access 2002 Runtime
Product ID : 11111-000-11111111-22222
Product Key : XXXXX-XXXXX-XXXXX-XXXXX-XXXXX
Installation Folder :
Service Pack :
Computer Name : PC-Name
Modified Time : 21.05.2012 11:29:27
==================================================
==================================================
Product Name : Microsoft Office Single Image 2010
Product ID : 22222-000-11111111-11111
Product Key : XXXXX-XXXXX-XXXXX-XXXXX-XXXXX
Installation Folder : C:\Program Files (x86)\Microsoft Office\Office14\
Service Pack :
Computer Name : PC-Name
Modified Time : 14.05.2012 16:17:38
==================================================
==================================================
Product Name : Microsoft Office Single Image 2010
Product ID : 22222-000-11111111-11111
Product Key : XXXXX-XXXXX-XXXXX-XXXXX-XXXXX
Installation Folder : C:\Program Files (x86)\Microsoft Office\Office14\
Service Pack :
Computer Name : PC-Name
Modified Time : 14.05.2012 16:17:38
==================================================
==================================================
Product Name : Microsoft Office Visio 2010
Product ID : 33333-000-11111111-33333
Product Key : XXXXX-XXXXX-XXXXX-XXXXX-XXXXX
Installation Folder : C:\Program Files (x86)\Microsoft Office\Office14\
Service Pack :
Computer Name : PC-Name
Modified Time : 15.05.2012 10:46:06
==================================================
==================================================
Product Name : Microsoft Office Visio 2010
Product ID : 33333-000-11111111-33333
Product Key : XXXXX-XXXXX-XXXXX-XXXXX-XXXXX
Installation Folder : C:\Program Files (x86)\Microsoft Office\Office14\
Service Pack :
Computer Name : PC-Name
Modified Time : 15.05.2012 10:46:06
==================================================
Nun will ich aber primär erst einmal den Key für Office 2012 auswerten, also in etwa: Finde "Product Name : Microsoft Office Single Image 2010" und gib mir die darauf folgende Zeile "Product Key" aus (zusammenschnippeln bekomm ich dann selbst hin).
Was wäre die beste Herangehensweise, dass ich nicht z. B. die Visio-Lizenz oder die Access-Lizenz oder ähnliches erwische, sondern wirklich nur "Microsoft Office Single Image 2010"?
Hier noch der Auszug, wie ich das beim Auslesen des Betriebssystems gelöst habe:
"\\Pfad\ProduKey.exe" /WindowsKeys 1 /OfficeKeys 0 /IEKeys 0 /SQLKeys 0 /ExchangeKeys 0 /ExtractEdition 0 /stext > %temp%\licence.txt
Damit wird die TXT für das OS erstellt.
Und hier wird sie nun ausgelesen und als Variable geschrieben:
For /F "tokens=4" %%f in ('Find "Product Key :" %temp%\licence.txt') do set key=%%f
For /F "tokens=2* delims=: " %%a in ('find "Product Name" "%temp%\licence.txt"') Do @Set "ossystem=%%b"
Das Schreiben in die CSV ist dann natürlich kein Hexenwerk mehr, wenn ich einmal die korrekte Variable habe. Dass die Rechner das nicht doppelt machen, stelle ich sicher, indem ich sie beim erfolgreichen Schreiben in die CSV anschließend eine Prüfdatei in einem öffentlichen Ordner erstellen lasse (%computername%.txt). Sollte ich wieder eine Auswertung wollen, muss ich dann nur die .txt's löschen und es wird wieder in die CSV geschrieben. Das aber nur am Rande.
Hoffe, ich konnte die Problematik gut genug erklären
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 191801
Url: https://administrator.de/contentid/191801
Ausgedruckt am: 05.11.2024 um 06:11 Uhr
10 Kommentare
Neuester Kommentar
Verstehe ich das richtig und dir fehlt nur der Schritt, sämtliche TXT Dateien von den Rechnern, welche im Netzlaufwerk liegen zu parsen und immer PC-Name + Produkt-Name + Key in eine CSV zu schreiben? Sowas wie:
PC-NAME :: Produktname :: KEY
PC-Name :: Microsoft Access 2002 Runtime :: XXXX-XXXXX-XXXXX-XXXX
PC-Name :: Microsoft Access 2002 Runtime :: XXXX-XXXXX-XXXXX-XXXX
PC-Name :: Microsoft Office Single Image 2010 :: XXXX-XXXXX-XXXXX-XXXX
PC-Name :: Microsoft Office Single Image 2010 :: XXXX-XXXXX-XXXXX-XXXX
PC-Name :: Microsoft Office Visio 2010 :: XXXX-XXXXX-XXXXX-XXXX
PC-Name :: Microsoft Office Visio 2010 :: XXXX-XXXXX-XXXXX-XXXX
Ich hab deinen Text jetzt 5 mal gelesen und bin mir nicht sicher was du genau willst, konkretisiert das bitte einmal, ich kann dir in jedem Fall helfen denke ich.
PC-NAME :: Produktname :: KEY
PC-Name :: Microsoft Access 2002 Runtime :: XXXX-XXXXX-XXXXX-XXXX
PC-Name :: Microsoft Access 2002 Runtime :: XXXX-XXXXX-XXXXX-XXXX
PC-Name :: Microsoft Office Single Image 2010 :: XXXX-XXXXX-XXXXX-XXXX
PC-Name :: Microsoft Office Single Image 2010 :: XXXX-XXXXX-XXXXX-XXXX
PC-Name :: Microsoft Office Visio 2010 :: XXXX-XXXXX-XXXXX-XXXX
PC-Name :: Microsoft Office Visio 2010 :: XXXX-XXXXX-XXXXX-XXXX
Ich hab deinen Text jetzt 5 mal gelesen und bin mir nicht sicher was du genau willst, konkretisiert das bitte einmal, ich kann dir in jedem Fall helfen denke ich.
moin,
Wenn je Programm 7 Auflistungen sind könnten diese so in Variablen gezogen werden.
Test auf der CMD-Line:
Wie die Zusammengebauten Variablen in die CSV eingetragen werden weist Du ja bestimmt schon.
Gruß Phil
Wenn je Programm 7 Auflistungen sind könnten diese so in Variablen gezogen werden.
Test auf der CMD-Line:
for /f "tokens=1-4*delims= " %a in ('find ":" ^<"D:\Test\Lizensen.txt" ^|find /n /v "" ') do @for /f "tokens=*delims=1" %i in ('set /a "x=((%a-1)/7) +1001" ') do @set "%i_%b_%c=%e"
set 0
Wie die Zusammengebauten Variablen in die CSV eingetragen werden weist Du ja bestimmt schon.
Gruß Phil
warum gebe ich nie die gewünschten Antworten?
einfach geht's in Linux mit der Bash: grep, wc usw., ich würde - wenn partout nur Windows-Rechner zur Verfügung stehen, auf einem die Cygwin-Umgebung aufsetzen, dann ProduKey das Netz scannen lassen und dann grep auf die einzelnen Typen anwenden.
Das Tool klingt sehr einfach - auch nur für DesasterRecovery - den Netzscan für den Admin aufzuheben, so häufig zerstören sich ja auch Windows-PC doch nicht - braucht man's da noch in der CSV?
Oh guck: http://gnuwin32.sourceforge.net/packages/grep.htm
auch einzeln für Windows - ohne Cygwin - damit sollte auch Dein Ziel, daß die PC sich selbst erfassen zu lösen sein.
HG
Mark
einfach geht's in Linux mit der Bash: grep, wc usw., ich würde - wenn partout nur Windows-Rechner zur Verfügung stehen, auf einem die Cygwin-Umgebung aufsetzen, dann ProduKey das Netz scannen lassen und dann grep auf die einzelnen Typen anwenden.
Das Tool klingt sehr einfach - auch nur für DesasterRecovery - den Netzscan für den Admin aufzuheben, so häufig zerstören sich ja auch Windows-PC doch nicht - braucht man's da noch in der CSV?
Oh guck: http://gnuwin32.sourceforge.net/packages/grep.htm
auch einzeln für Windows - ohne Cygwin - damit sollte auch Dein Ziel, daß die PC sich selbst erfassen zu lösen sein.
HG
Mark
wenn es nur 2 Zeilen nachher ist: Mit Find bzw Findstr lässt sich sowas auch auf der CMD-Line ansehen:
Gruß Phil
for %i in ("%temp%\licence.txt" ) do @for /f "tokens=2delims=:" %a in ('findstr /nc:": Microsoft Office Single Image 2010" "%~i" ^|findstr /n "^" ^|findstr /b "1:" ') do @for /f %b in ('set /a "x=%a+2" ') do @for /f "tokens=3*" %c in ('findstr /n "^" "%~i" ^|findstr /b "%b:" ') do @echo Zeile%b: Key %d
Gruß Phil
@pleh-ejdsch - na bitte, sogar Windows kann's
@snakerl - die Homepage sagt, daß das Programm Netze scannen kann - also einmal auf einem Server ausgeführt läuft.
(GREP als einziges Binärprogramm sollte auch verteilbar sein - ist nun aber ja unnötig)
@snakerl - die Homepage sagt, daß das Programm Netze scannen kann - also einmal auf einem Server ausgeführt läuft.
(GREP als einziges Binärprogramm sollte auch verteilbar sein - ist nun aber ja unnötig)
@snakerl
Ein wenig Hilfe:
---- Die Zeilennummer der Datei habe ich nun in der Variable %a.
Ja - mehr macht es eigentlich nicht. Wenn man weis, was man braucht ist es ganz einfach zu lösen.
Gruß Phil
Ein wenig Hilfe:
- Die erste For-Schleife gibt mir die Textdatei in die Variable %i, weil ich die mehr als einmal benötige.
- In der zweiten For-Schleife wird in der Datei "%~i" nach den Suchwerten gesucht und mit Zeilennummer Versehen.
---- Die Zeilennummer der Datei habe ich nun in der Variable %a.
- In der dritten For-Schleife wird diese Zeilennummer plus 2 gerechnet, das Ergebnis befindet sich in der Variable %b.
- In der vierten For-Schleife wird die Datei "%~i" nummeriert und die jetzige Zeile,
Ja - mehr macht es eigentlich nicht. Wenn man weis, was man braucht ist es ganz einfach zu lösen.
Gruß Phil