Registry-Unterschlüssel durchsuchen
Hallo,
irgendwie stehe ich auf der Leitung...
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.
Danke schon mal im Voraus!
Torsten
irgendwie stehe ich auf der Leitung...
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 230915
Url: https://administrator.de/forum/registry-unterschluessel-durchsuchen-230915.html
Ausgedruckt am: 26.12.2024 um 15:12 Uhr
9 Kommentare
Neuester Kommentar
Hallo Torsten,
um zwischen 32 und 64bit OS zu unterscheiden, kannst du folgende Funktion nutzen:
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.
Grüße Uwe
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
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
Wenn's das dann war den Beitrag bitte noch als gelöst markieren. Merci.
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
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
Hi,
das ist VBS nicht Batch , da ist es klar das die Variable nicht expandiert wird...
Das machst du so über das objShell Objekt
(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
das ist VBS nicht Batch , 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"
'......
Grüße Uwe
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:
VBS:
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
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
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 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.