Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Auslesen einer TXT und aus einem bestimmten Abschnitt Inhalte als Variable schreiben

Frage Entwicklung Batch & Shell

Mitglied: snakerl

snakerl (Level 1) - Jetzt verbinden

25.09.2012, aktualisiert 16:17 Uhr, 3525 Aufrufe, 10 Kommentare

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:

01.
"\\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:

01.
================================================== 
02.
Product Name      : Microsoft Access 2002 Runtime 
03.
Product ID        : 11111-000-11111111-22222 
04.
Product Key       : XXXXX-XXXXX-XXXXX-XXXXX-XXXXX 
05.
Installation Folder :  
06.
Service Pack      :  
07.
Computer Name     : PC-Name 
08.
Modified Time     : 21.05.2012 11:29:27 
09.
================================================== 
10.
 
11.
================================================== 
12.
Product Name      : Microsoft Access 2002 Runtime 
13.
Product ID        : 11111-000-11111111-22222 
14.
Product Key       : XXXXX-XXXXX-XXXXX-XXXXX-XXXXX 
15.
Installation Folder :  
16.
Service Pack      :  
17.
Computer Name     : PC-Name 
18.
Modified Time     : 21.05.2012 11:29:27 
19.
================================================== 
20.
 
21.
================================================== 
22.
Product Name      : Microsoft Office Single Image 2010 
23.
Product ID        : 22222-000-11111111-11111 
24.
Product Key       : XXXXX-XXXXX-XXXXX-XXXXX-XXXXX 
25.
Installation Folder : C:\Program Files (x86)\Microsoft Office\Office14\ 
26.
Service Pack      :  
27.
Computer Name     : PC-Name 
28.
Modified Time     : 14.05.2012 16:17:38 
29.
================================================== 
30.
 
31.
================================================== 
32.
Product Name      : Microsoft Office Single Image 2010 
33.
Product ID        : 22222-000-11111111-11111 
34.
Product Key       : XXXXX-XXXXX-XXXXX-XXXXX-XXXXX 
35.
Installation Folder : C:\Program Files (x86)\Microsoft Office\Office14\ 
36.
Service Pack      :  
37.
Computer Name     : PC-Name 
38.
Modified Time     : 14.05.2012 16:17:38 
39.
================================================== 
40.
 
41.
================================================== 
42.
Product Name      : Microsoft Office Visio 2010 
43.
Product ID        : 33333-000-11111111-33333 
44.
Product Key       : XXXXX-XXXXX-XXXXX-XXXXX-XXXXX 
45.
Installation Folder : C:\Program Files (x86)\Microsoft Office\Office14\ 
46.
Service Pack      :  
47.
Computer Name     : PC-Name 
48.
Modified Time     : 15.05.2012 10:46:06 
49.
================================================== 
50.
 
51.
================================================== 
52.
Product Name      : Microsoft Office Visio 2010 
53.
Product ID        : 33333-000-11111111-33333 
54.
Product Key       : XXXXX-XXXXX-XXXXX-XXXXX-XXXXX 
55.
Installation Folder : C:\Program Files (x86)\Microsoft Office\Office14\ 
56.
Service Pack      :  
57.
Computer Name     : PC-Name 
58.
Modified Time     : 15.05.2012 10:46:06 
59.
==================================================
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:

01.
"\\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:

01.
For /F "tokens=4" %%f in ('Find "Product Key       :" %temp%\licence.txt') do set key=%%f 
02.
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
Mitglied: Maveric
25.09.2012 um 17:01 Uhr
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.
Bitte warten ..
Mitglied: pieh-ejdsch
25.09.2012, aktualisiert um 17:11 Uhr
moin,

Wenn je Programm 7 Auflistungen sind könnten diese so in Variablen gezogen werden.
Test auf der CMD-Line:
01.
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" 
02.
 
03.
set 0
Wie die Zusammengebauten Variablen in die CSV eingetragen werden weist Du ja bestimmt schon.

Gruß Phil
Bitte warten ..
Mitglied: snakerl
25.09.2012, aktualisiert um 20:05 Uhr
@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 ;) )
Bitte warten ..
Mitglied: broecker
25.09.2012 um 21:24 Uhr
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
Bitte warten ..
Mitglied: snakerl
25.09.2012 um 21:51 Uhr
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).
Bitte warten ..
Mitglied: pieh-ejdsch
25.09.2012 um 22:07 Uhr
wenn es nur 2 Zeilen nachher ist: Mit Find bzw Findstr lässt sich sowas auch auf der CMD-Line ansehen:
01.
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
Bitte warten ..
Mitglied: broecker
25.09.2012 um 22:21 Uhr
@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)
Bitte warten ..
Mitglied: snakerl
25.09.2012 um 23:08 Uhr
@pieh-ejdsch: Wird morgen getestet, danke

@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.
Bitte warten ..
Mitglied: snakerl
26.09.2012 um 12:11 Uhr
@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
Bitte warten ..
Mitglied: pieh-ejdsch
26.09.2012 um 12:53 Uhr
@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
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
gelöst DWORD (Name immer verschieden) eines RegKeys auslesen und in Variable schreiben (2)

Frage von reissaus73 zum Thema Batch & Shell ...

Batch & Shell
gelöst Mehrere Ordnernamen auslesen und in eine Variable schreiben (5)

Frage von schmitho zum Thema Batch & Shell ...

Batch & Shell
gelöst Selected Gridview Value in Variable schreiben (4)

Frage von reissaus73 zum Thema Batch & Shell ...

PHP
gelöst HTML Dropdownmenü auslesen und in PHP als Variable übergeben (35)

Frage von ITFlori zum Thema PHP ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (17)

Frage von liquidbase zum Thema Windows Update ...