snakerl
Goto Top

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 face-smile

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 face-smile

Content-Key: 191801

Url: https://administrator.de/contentid/191801

Ausgedruckt am: 29.03.2024 um 06:03 Uhr

Mitglied: Maveric
Maveric 25.09.2012 um 17:01:14 Uhr
Goto Top
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.
Mitglied: pieh-ejdsch
pieh-ejdsch 25.09.2012 aktualisiert um 17:11:13 Uhr
Goto Top
moin,

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
Mitglied: snakerl
snakerl 25.09.2012 aktualisiert um 20:05:38 Uhr
Goto Top
@Maveric:
Sorry, hab mir echt Mühe gegeben :D

Also, nein, nicht ganz. Es ist anders.

Der Rechner fährt hoch, der User meldet sich an, das Anmeldescript löst ein weiteres Script aus. Dieses prüft, ob schon einmal eine Lizenzprüfung vorgenommen wurde, wenn nicht, führt es oben genanntes Command aus, welches unter %temp% die licence.txt (also lokal generiert). Diese auszulesen ist beim Betriebssystem kein Problem, denn hier gibt es nur einen Eintrag. Bei Office kann (muss aber nicht) es zu mehreren Einträgen kommen. Je nachdem, ob z. B. Visio, Project usw. installiert sind, in meinem Beispiel (ist das Log meines Rechners) isses Office 2010, Visio 2010 und eine Access 2002 Runtime, die es zu einem DB-Programm dazugab.

Da nun mehrere Einträge mit "Product Name" und "Product Key" vorhanden sind, brauche ich also einen Weg, der Abfrage zu sagen: gib mir nur den Key aus, wenn die Zeile Product Name lautet "Product Name : Microsoft Office Single Image 2010" und schreiben mir diesen dazugehörigen "Product Key" (er steht 2 Zeilen darunter) in die Variable, äh, sagen wir %officekey%. Das Weiterverarbeiten einer Variable und schreiben in ne CSV ist ja dann nicht mehr das Problem, nur das exakte Auslesen genau diesen einen Keys ist das Schwierige (für mich).

@phil:
Leider kann ich nicht garantieren, wie die Ausgabe genau erfolgt, ich kann nicht mal sagen, ob die Produkte in dieser Reihenfolge erscheinen. Bei 90% der Benutzer ist nur Office 2012 installiert, somit 2 Einträge in der TXT (die exakt gleich sind, warum sie 2x erscheinen weiß ich nicht so ganz). Aber es kann wie gesagt, wie bei meinem PC zu sehen ist, Abweichungen geben. Ich weiß nicht, ob es so etwas gibt, bzw. ob man "find" so manipulieren kann, dass das klappt, aber am günstigsten wäre es, man könne dem Script sagen:
Finde in licence.txt die Zeile "Product Name : Microsoft Office Single Image 2010" und gehe in die übernächste Zeile und kopiere dir diese (oder nur den Key, aber wie gesagt, rumschnippseln würde ich dann selbst versuchen ;) )
Mitglied: broecker
broecker 25.09.2012 um 21:24:23 Uhr
Goto Top
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
Mitglied: snakerl
snakerl 25.09.2012 um 21:51:24 Uhr
Goto Top
Also wenn die von Ihnen genannte EXE einfach so überall lauffähig wäre (s. ProduKey.exe), man sie also auf irgendeinen Share ablegen und ansprechen könnte, wäre das eine Alternative, aber so leider nicht. Ich denke (und hoffe), es geht auch mit Windows-Boardmitteln und ich bin einfach nur zu blöd, es selbst hinzubekommen.

Dennoch danke für den Anstoß, GREP klingt interessant, nur leider nicht einfach genug in der Windows-Welt zu integrieren (soll ja auf jedem Client laufen).
Mitglied: pieh-ejdsch
pieh-ejdsch 25.09.2012 um 22:07:47 Uhr
Goto Top
wenn es nur 2 Zeilen nachher ist: Mit Find bzw Findstr lässt sich sowas auch auf der CMD-Line ansehen:
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
Mitglied: broecker
broecker 25.09.2012 um 22:21:32 Uhr
Goto Top
@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)
Mitglied: snakerl
snakerl 25.09.2012 um 23:08:39 Uhr
Goto Top
@pieh-ejdsch: Wird morgen getestet, danke face-smile

@broecker: Und wenn der Client just in der Sekunde nicht am Netz ist, dann hab ich auch keine Auswertung, deswegen habe ich diese Möglichkeit beim Überfliegen der Parameter von ProduKey auch sogleich verworfen, sondern möchte die Auswertung vom Client auslösen lassen.
Mitglied: snakerl
snakerl 26.09.2012 um 12:11:21 Uhr
Goto Top
@pieh-ejdsch:

Ich bin schwer beeindruckt. Dein Command funktioniert einwandfrei, auch wenn ich noch am auseinanderklabustern bin, um es zu verstehen :D

Vielen, vielen Dank face-smile
Mitglied: pieh-ejdsch
pieh-ejdsch 26.09.2012 um 12:53:34 Uhr
Goto Top
@snakerl

Ein wenig Hilfe:
  • Die erste For-Schleife gibt mir die Textdatei in die Variable %i, weil ich die mehr als einmal benötige.
---- Im Batch stellt man dafür Variablen mit set bereit.
  • In der zweiten For-Schleife wird in der Datei "%~i" nach den Suchwerten gesucht und mit Zeilennummer Versehen.
---- Weil nur eine Ausgabe benötigt wird, wird diese nochmals nummeriert und davon nur die erste Zeile verwertet.
---- 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,
---- welche mit der Nummer aus %b gefolgt von Doppelpunkt beginnt in der Variable %d angezeigt

Ja - mehr macht es eigentlich nicht. Wenn man weis, was man braucht ist es ganz einfach zu lösen.

Gruß Phil