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
GELÖST

Registry-Unterschlüssel durchsuchen

Frage Entwicklung VB for Applications

Mitglied: goodbytes

goodbytes (Level 2) - Jetzt verbinden

25.02.2014, aktualisiert 09:40 Uhr, 1879 Aufrufe, 9 Kommentare, 1 Danke

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.

01.
strComputer = "." 
02.
 
03.
Set objWMIService = GetObject("winmgmts:" _ 
04.
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") 
05.
Set colSoftware = objWMIService.ExecQuery _ 
06.
	'("Select * from Win32_Product'") 
07.
 
08.
strOfficeProducts = "" 
09.
For Each objSoftware in colSoftware 
10.
	    strOfficeProducts = strOfficeProducts & objSoftware.Caption & vbcrlf 
11.
Next 
12.
WScript.Echo strOfficeProducts

Danke schon mal im Voraus!

Torsten
Mitglied: colinardo
LÖSUNG 25.02.2014, aktualisiert 06.05.2014
Hallo Torsten,
um zwischen 32 und 64bit OS zu unterscheiden, kannst du folgende Funktion nutzen:
01.
Function is64Bit() 
02.
	Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") 
03.
	Set colItems = objWMIService.ExecQuery("Select OSArchitecture from Win32_OperatingSystem") 
04.
	For Each objItem in colItems 
05.
		If LCase(objItem.OSArchitecture) = "64-bit" Then 
06.
			is64Bit = True 
07.
		Else 
08.
			is64Bit = False 
09.
		End If  
10.
	Next 
11.
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.
01.
Dim liste 
02.
strPathListe = "programmliste.txt"  
03.
Const HKLM = &H80000002 
04.
Set fso = CreateObject("Scripting.Filesystemobject") 
05.
Set objShell = CreateObject("Wscript.Shell") 
06.
Set myRegExp = CreateObject("vbscript.regexp") 
07.
myRegExp.IgnoreCase = True 
08.
myRegExp.Pattern = "KB\d{6,}" 
09.
 
10.
strKey = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" 
11.
strKey64 = "SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\" 
12.
Set objReg = GetObject("winmgmts://./root/default:StdRegProv") 
13.
 
14.
objReg.EnumKey HKLM, strKey, arrSubkeys 
15.
For Each strSubkey In arrSubkeys 
16.
  intRet1 = objReg.GetStringValue(HKLM, strKey & strSubkey,"DisplayName", strValue1) 
17.
  If strValue1 <> "" Then 
18.
  	If Not myRegExp.Test(strValue1) Then 
19.
    	liste = liste & strValue1 & vbNewLine 
20.
    End If 
21.
  End If 
22.
Next 
23.
 
24.
If is64Bit() Then 
25.
	objReg.EnumKey HKLM, strKey64, arrSubkeys 
26.
	For Each strSubkey In arrSubkeys 
27.
	  intRet1 = objReg.GetStringValue(HKLM, strKey64 & strSubkey,"DisplayName", strValue1) 
28.
	  If strValue1 <> "" Then 
29.
	    If Not myRegExp.Test(strValue1) Then 
30.
    		liste = liste & strValue1 & vbNewLine 
31.
   		End If 
32.
	  End If 
33.
	Next 
34.
End If 
35.
 
36.
fso.OpenTextFile(strPathListe,2,True).Write(liste) 
37.
objShell.Run "notepad.exe " & strPathListe 
38.
Set fso = Nothing 
39.
set objShell = Nothing 
40.
set myRegExp = Nothing 
41.
 
42.
' Functions ------- 
43.
Function is64Bit() 
44.
	Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") 
45.
	Set colItems = objWMIService.ExecQuery("Select OSArchitecture from Win32_OperatingSystem") 
46.
	For Each objItem in colItems 
47.
		If LCase(objItem.OSArchitecture) = "64-bit" Then 
48.
			is64Bit = True 
49.
		Else 
50.
			is64Bit = False 
51.
		End If  
52.
	Next 
53.
End Function
Grüße Uwe
Bitte warten ..
Mitglied: colinardo
LÖSUNG 06.05.2014, aktualisiert um 16:46 Uhr
Wenn's das dann war den Beitrag bitte noch als gelöst markieren. Merci.
Bitte warten ..
Mitglied: goodbytes
06.05.2014, aktualisiert um 16:48 Uhr
Sorry, völlig übersehen...

Vielen Dank colinardo !!!

Gruß
Torsten
Bitte warten ..
Mitglied: D1Ck3n
27.10.2016 um 09:18 Uhr
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
Bitte warten ..
Mitglied: colinardo
27.10.2016, aktualisiert um 09:37 Uhr
Hi,
das ist VBS nicht Batch , da ist es klar das die Variable nicht expandiert wird...
Das machst du so über das objShell Objekt
01.
Set fso = CreateObject("Scripting.Filesystemobject") 
02.
Set objShell = CreateObject("Wscript.Shell") 
03.
Set myRegExp = CreateObject("vbscript.regexp") 
04.
strPathListe = objShell.ExpandEnvironmentStrings("%COMPUTERNAME%") & ".txt"  
05.
'......
(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
Bitte warten ..
Mitglied: D1Ck3n
27.10.2016 um 10:30 Uhr
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
Bitte warten ..
Mitglied: D1Ck3n
27.10.2016, aktualisiert um 16:16 Uhr
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:
01.
@echo off & setlocal 
02.
:: Der Dienst opsiclientd muss gestoppt werden um den Cache zu leeren 
03.
echo beende OPSI Client Dienst... 
04.
set Status=NichDa 
05.
for /f "tokens=4" %%b in ('sc query opsiclientd ^|find "STATE "') do set Status=%%b 
06.
echo [Debug] Status: %Status% 
07.
if /i "%Status%" == "RUNNING" net stop opsiclientd 
08.
if /i "%Status%" == "NichDa" ( 
09.
echo Irgendetwas Unerwartetes ist passiert...schau mal nach!.. 
10.
pause 
11.
:: Starte Dienste und guck per Hand 
12.
%windir%\system32\services.msc 
13.
exit 
14.
15.
pause 
16.
:: Welchel in das Cache-Verzeichnis + Löschung der .sqlite Dateien 
17.
echo loesche sqlite Dateien aus OPSI Cache... 
18.
cd C:\opsi.org\cache\config 
19.
del *.sqlite 
20.
pause 
21.
:: opsiclientd wird wieder gestartet 
22.
echo starte OPSI Client Dienst... 
23.
for /f "tokens=4" %%b in ('sc query opsiclientd ^|find "STATE "') do set Status=%%b 
24.
echo [Debug] Status: %Status% 
25.
if /i "%Status%" == "STOPPED" net start opsiclientd 
26.
if /i "%Status%" == "NichDa" ( 
27.
echo Irgendetwas Unerwartetes ist passiert...schau mal nach!.. 
28.
pause 
29.
%windir%\system32\services.msc 
30.
exit 
31.
32.
pause 
33.
endlocal 
34.
:: öffnet OPSI Info Webinterface um zu sehen, ob die Events wieder funktionieren! 
35.
echo oeffne Info Page... 
36.
:: Setze Variable für Ablageort des Skriptes 
37.
set SCRIPT_LOCATION=%~dp0 
38.
"%SCRIPT_LOCATION%OPSI_info.url" 
39.
pause 
40.
:: erstellt eine Software-Inventur von dem Rechner 
41.
echo erstelle Software-Inventur fuer %COMPUTERNAME% 
42.
call "%SCRIPT_LOCATION%Installierte_Software\01_programmliste.vbs" 
43.
pause
VBS:
01.
Dim liste 
02.
Const HKLM = &H80000002 
03.
Set fso = CreateObject("Scripting.Filesystemobject") 
04.
Set objShell = CreateObject("Wscript.Shell") 
05.
Set myRegExp = CreateObject("vbscript.regexp") 
06.
strPathListe = objShell.ExpandEnvironmentStrings("%COMPUTERNAME%") & ".txt" 
07.
myRegExp.IgnoreCase = True 
08.
myRegExp.Pattern = "KB\d{6,}" 
09.
 
10.
strKey = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" 
11.
strKey64 = "SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\" 
12.
Set objReg = GetObject("winmgmts://./root/default:StdRegProv") 
13.
 
14.
objReg.EnumKey HKLM, strKey, arrSubkeys 
15.
For Each strSubkey In arrSubkeys 
16.
  intRet1 = objReg.GetStringValue(HKLM, strKey & strSubkey,"DisplayName", strValue1) 
17.
  If strValue1 <> "" Then 
18.
  	If Not myRegExp.Test(strValue1) Then 
19.
    	liste = liste & strValue1 & vbNewLine 
20.
    End If 
21.
  End If 
22.
Next 
23.
 
24.
If is64Bit() Then 
25.
	objReg.EnumKey HKLM, strKey64, arrSubkeys 
26.
	For Each strSubkey In arrSubkeys 
27.
	  intRet1 = objReg.GetStringValue(HKLM, strKey64 & strSubkey,"DisplayName", strValue1) 
28.
	  If strValue1 <> "" Then 
29.
	    If Not myRegExp.Test(strValue1) Then 
30.
    		liste = liste & strValue1 & vbNewLine 
31.
   		End If 
32.
	  End If 
33.
	Next 
34.
End If 
35.
 
36.
fso.OpenTextFile(strPathListe,2,True).Write(liste) 
37.
objShell.Run "notepad.exe " & strPathListe 
38.
Set fso = Nothing 
39.
set objShell = Nothing 
40.
set myRegExp = Nothing 
41.
 
42.
' Functions ------- 
43.
Function is64Bit() 
44.
	Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") 
45.
	Set colItems = objWMIService.ExecQuery("Select OSArchitecture from Win32_OperatingSystem") 
46.
	For Each objItem in colItems 
47.
		If LCase(objItem.OSArchitecture) = "64-bit" Then 
48.
			is64Bit = True 
49.
		Else 
50.
			is64Bit = False 
51.
		End If  
52.
	Next 
53.
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
Bitte warten ..
Mitglied: colinardo
27.10.2016, aktualisiert um 18:41 Uhr
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.
Bitte warten ..
Mitglied: D1Ck3n
28.10.2016 um 08:00 Uhr
Ups sorry, das nächste mal mache ich ein neues Thema auf, versprochen!

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
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (25)

Frage von M.Marz zum Thema Windows Server ...

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Erkennung und -Abwehr
Spam mit eigener Domain (12)

Frage von NoobOne zum Thema Erkennung und -Abwehr ...