goodbytes
Goto Top

Registry-Unterschlüssel durchsuchen

Hallo,
irgendwie stehe ich auf der Leitung... face-sad

Wie kann ich mittels vbs einen Wert jedes nächsten Unterschlüssels auslesen und in Textdatei schreiben?

Mir geht es darum. Es muss unterschieden werden ob es ein 32-Bit oder 64-Bit Betriebssystem ist (existiert der Schlüssel "HKLM\SOFTWARE\Wow6432Node"?).

Dann je nach Ergebnis bei jedem Unterschlüssel von "...\Microsoft\Windows\CurrentVersion\Uninstall" den Eintrag "DisplayVersion"" auslesen.

Ich möchte einfach eine Liste mit aller installierter Software erstellen.

Hier ist ein erster Ansatz, ich muss nur noch nach "DisplayVersion"" filtern und das ausgeben. Ideal wäre natürlich, wenn ich alle Microsoft-Patches ("KB*"") dabei ausblende.

strComputer = "."  

Set objWMIService = GetObject("winmgmts:" _  
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")  
Set colSoftware = objWMIService.ExecQuery _
	'("Select * from Win32_Product'")  

strOfficeProducts = ""  
For Each objSoftware in colSoftware
	    strOfficeProducts = strOfficeProducts & objSoftware.Caption & vbcrlf
Next
WScript.Echo strOfficeProducts


Danke schon mal im Voraus!

Torsten

Content-Key: 230915

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

Printed on: April 19, 2024 at 22:04 o'clock

Member: colinardo
Solution colinardo Feb 25, 2014, updated at May 06, 2014 at 14:46:16 (UTC)
Goto Top
Hallo Torsten,
um zwischen 32 und 64bit OS zu unterscheiden, kannst du folgende Funktion nutzen:
Function is64Bit()
	Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")  
	Set colItems = objWMIService.ExecQuery("Select OSArchitecture from Win32_OperatingSystem")  
	For Each objItem in colItems
		If LCase(objItem.OSArchitecture) = "64-bit" Then  
			is64Bit = True
		Else
			is64Bit = False
		End If 
	Next
End Function
Die Funktion gibt True zurück wenn es ein 64Bit OS ist ansonsten False

Zusammengefasst könntest du so alle installierten Produkte (ohne KBs) in eine Textdatei schreiben lassen:
(Mit WMI werden bestimmte Applikationen nicht aufgelistet, deshalb die Abfrage aus der Registry um wirklich alles zu erfassen)
Im Beispiel werden die Namen der Programme in eine Textdatei ("programmliste.txt") im Verzeichnis des Scriptes geschrieben, und danach mit Notepad geöffnet.
Dim liste
strPathListe = "programmliste.txt"   
Const HKLM = &H80000002
Set fso = CreateObject("Scripting.Filesystemobject")  
Set objShell = CreateObject("Wscript.Shell")  
Set myRegExp = CreateObject("vbscript.regexp")  
myRegExp.IgnoreCase = True
myRegExp.Pattern = "KB\d{6,}"  

strKey = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\"  
strKey64 = "SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\"  
Set objReg = GetObject("winmgmts://./root/default:StdRegProv")  

objReg.EnumKey HKLM, strKey, arrSubkeys
For Each strSubkey In arrSubkeys
  intRet1 = objReg.GetStringValue(HKLM, strKey & strSubkey,"DisplayName", strValue1)  
  If strValue1 <> "" Then  
  	If Not myRegExp.Test(strValue1) Then
    	liste = liste & strValue1 & vbNewLine
    End If
  End If
Next

If is64Bit() Then
	objReg.EnumKey HKLM, strKey64, arrSubkeys
	For Each strSubkey In arrSubkeys
	  intRet1 = objReg.GetStringValue(HKLM, strKey64 & strSubkey,"DisplayName", strValue1)  
	  If strValue1 <> "" Then  
	    If Not myRegExp.Test(strValue1) Then
    		liste = liste & strValue1 & vbNewLine
   		End If
	  End If
	Next
End If

fso.OpenTextFile(strPathListe,2,True).Write(liste)
objShell.Run "notepad.exe " & strPathListe  
Set fso = Nothing
set objShell = Nothing
set myRegExp = Nothing

' Functions -------  
Function is64Bit()
	Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")  
	Set colItems = objWMIService.ExecQuery("Select OSArchitecture from Win32_OperatingSystem")  
	For Each objItem in colItems
		If LCase(objItem.OSArchitecture) = "64-bit" Then  
			is64Bit = True
		Else
			is64Bit = False
		End If 
	Next
End Function
Grüße Uwe
Member: colinardo
Solution colinardo May 06, 2014 updated at 14:46:18 (UTC)
Goto Top
Wenn's das dann war den Beitrag bitte noch als gelöst markieren. Merci.
Member: goodbytes
goodbytes May 06, 2014 updated at 14:48:01 (UTC)
Goto Top
Sorry, völlig übersehen... face-plain

Vielen Dank colinardo !!! face-smile

Gruß
Torsten
Member: D1Ck3n
D1Ck3n Oct 27, 2016 at 07:18:06 (UTC)
Goto Top
Hi Uwe,

das Thema hier ist zwar schon etwas älter, aber ich habe dazu noch eine Frage: Ich würde gerne anstelle von "programmliste.txt" die Ausgabedatei "%COMPUTERNAME%.txt" nennen, damit ich die txt den Computernamen zuordnen kann. Leider funktioniert es nicht, wenn ich nur die Variable da eingebe, denn dann öffnet sich zwar der Editor mit dem richtigen Computernamen, aber die Datei ist dann leer.

Könntest du mir da kurz helfen?

Grüße
D1Ck3n
Member: colinardo
colinardo Oct 27, 2016 updated at 07:37:47 (UTC)
Goto Top
Hi,
das ist VBS nicht Batch face-wink, da ist es klar das die Variable nicht expandiert wird...
Das machst du so über das objShell Objekt
Set fso = CreateObject("Scripting.Filesystemobject")  
Set objShell = CreateObject("Wscript.Shell")  
Set myRegExp = CreateObject("vbscript.regexp")  
strPathListe = objShell.ExpandEnvironmentStrings("%COMPUTERNAME%") & ".txt"   
'......  
(beachte hier bitte das Umordnen der Objekte! Das objShell Objekt muss vor dem setzen des Namens erstellt werden, denn sonst kannst du ja nicht auf dessen Funktionen zugreifen. Ich habe hier der Übersichtlichkeit halber alle Objekte davor verschoben.)

Grüße Uwe
Member: D1Ck3n
D1Ck3n Oct 27, 2016 at 08:30:41 (UTC)
Goto Top
Dachte ich mir schon, dass es dort anders sein wird, aber man kann es ja mal versuchen :D

Danke sehr für deine Antwort! Hat mir sehr geholfen!

Grüße
D1Ck3n
Member: D1Ck3n
D1Ck3n Oct 27, 2016 updated at 14:16:18 (UTC)
Goto Top
Ich habe direkt noch mal eine Frage ;)

Und zwar versuche ich das VBS aus einem Batch Skript heraus zu starten, was auch an sich funktioniert, aber mir wird keine .txt erzeugt.

Batch Skript:
@echo off & setlocal
:: Der Dienst opsiclientd muss gestoppt werden um den Cache zu leeren
echo beende OPSI Client Dienst...
set Status=NichDa
for /f "tokens=4" %%b in ('sc query opsiclientd ^|find "STATE "') do set Status=%%b  
echo [Debug] Status: %Status%
if /i "%Status%" == "RUNNING" net stop opsiclientd  
if /i "%Status%" == "NichDa" (  
echo Irgendetwas Unerwartetes ist passiert...schau mal nach!..
pause
:: Starte Dienste und guck per Hand
%windir%\system32\services.msc
exit
)
pause
:: Welchel in das Cache-Verzeichnis + Löschung der .sqlite Dateien
echo loesche sqlite Dateien aus OPSI Cache...
cd C:\opsi.org\cache\config
del *.sqlite
pause
:: opsiclientd wird wieder gestartet
echo starte OPSI Client Dienst...
for /f "tokens=4" %%b in ('sc query opsiclientd ^|find "STATE "') do set Status=%%b  
echo [Debug] Status: %Status%
if /i "%Status%" == "STOPPED" net start opsiclientd  
if /i "%Status%" == "NichDa" (  
echo Irgendetwas Unerwartetes ist passiert...schau mal nach!..
pause
%windir%\system32\services.msc
exit
)
pause
endlocal
:: öffnet OPSI Info Webinterface um zu sehen, ob die Events wieder funktionieren!
echo oeffne Info Page...
:: Setze Variable für Ablageort des Skriptes
set SCRIPT_LOCATION=%~dp0
"%SCRIPT_LOCATION%OPSI_info.url"  
pause
:: erstellt eine Software-Inventur von dem Rechner
echo erstelle Software-Inventur fuer %COMPUTERNAME%
call "%SCRIPT_LOCATION%Installierte_Software\01_programmliste.vbs"  
pause

VBS:
Dim liste
Const HKLM = &H80000002
Set fso = CreateObject("Scripting.Filesystemobject")  
Set objShell = CreateObject("Wscript.Shell")  
Set myRegExp = CreateObject("vbscript.regexp")  
strPathListe = objShell.ExpandEnvironmentStrings("%COMPUTERNAME%") & ".txt"  
myRegExp.IgnoreCase = True
myRegExp.Pattern = "KB\d{6,}"  

strKey = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\"  
strKey64 = "SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\"  
Set objReg = GetObject("winmgmts://./root/default:StdRegProv")  

objReg.EnumKey HKLM, strKey, arrSubkeys
For Each strSubkey In arrSubkeys
  intRet1 = objReg.GetStringValue(HKLM, strKey & strSubkey,"DisplayName", strValue1)  
  If strValue1 <> "" Then  
  	If Not myRegExp.Test(strValue1) Then
    	liste = liste & strValue1 & vbNewLine
    End If
  End If
Next

If is64Bit() Then
	objReg.EnumKey HKLM, strKey64, arrSubkeys
	For Each strSubkey In arrSubkeys
	  intRet1 = objReg.GetStringValue(HKLM, strKey64 & strSubkey,"DisplayName", strValue1)  
	  If strValue1 <> "" Then  
	    If Not myRegExp.Test(strValue1) Then
    		liste = liste & strValue1 & vbNewLine
   		End If
	  End If
	Next
End If

fso.OpenTextFile(strPathListe,2,True).Write(liste)
objShell.Run "notepad.exe " & strPathListe  
Set fso = Nothing
set objShell = Nothing
set myRegExp = Nothing

' Functions -------  
Function is64Bit()
	Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")  
	Set colItems = objWMIService.ExecQuery("Select OSArchitecture from Win32_OperatingSystem")  
	For Each objItem in colItems
		If LCase(objItem.OSArchitecture) = "64-bit" Then  
			is64Bit = True
		Else
			is64Bit = False
		End If 
	Next
End Function

Führe ich das VBS über Rechtsklick -> öffne mit Eingabeaufforderung aus, wird mir die Liste erstellt und an dem Ort abgelegt, wo ich das Skript ausgeführt habe. Starte ich das VBS aus einer Batch/CMD heraus, wird mir in einem Editor die Liste gezeigt, aber die wird nicht dort abgelegt, wo auch das VBS liegt.

Woran könnte das liegen?

Grüße
D1Ck3n
Member: colinardo
colinardo Oct 27, 2016 updated at 16:41:53 (UTC)
Goto Top
Ich habe direkt noch mal eine Frage ;)
Ja nee, neue Frage neuer Thread! Hier einfach einen fremden Thread mit anderen Fragen übernehmen geht gar nicht face-sad
Du kannst mich gerne via PM anschreiben.

Die Datei wird schon erzeugt immer dort wo das VBS aufgerufen wird in deinem Fall hier (cd C:\opsi.org\cache\config), entweder wechsele in das Verzeichnis deiner Wahl oder gebe das absolute Verzeichnis im VBS Script mit an.
Member: D1Ck3n
D1Ck3n Oct 28, 2016 at 06:00:22 (UTC)
Goto Top
Ups sorry, das nächste mal mache ich ein neues Thema auf, versprochen! face-smile

Du hast vollkommen Recht! Mir ist das gestern Abend auch noch mal eingefallen, dass ich das Skript immer in den falschen Verzeichnissen aufgerufen habe ;)

Danke trotzdem für die Antort!

Grüße
D1Ck3n