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

VBScript - Array gezielt abfragen

Frage Entwicklung VB for Applications

Mitglied: appleseed

appleseed (Level 1) - Jetzt verbinden

06.12.2007, aktualisiert 08.12.2007, 5705 Aufrufe, 3 Kommentare

Hallo,

mit folgendem Script ist es mir möglich, die Registrierung nach installierter Software auf einem PC abzufragen:


01.
Const HKCR = &H80000000 
02.
Const HKCU = &H80000001 
03.
Const HKLM = &H80000002 
04.
 
05.
Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & ".\root\default:StdRegProv") 
06.
 
07.
sUninstallPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" 
08.
 
09.
oReg.EnumKey HKLM, sUninstallPath, aSubkeys 
10.
 
11.
On Error Resume Next 
12.
For Each sSubkey In aSubkeys 
13.
oReg.GetStringValue HKLM, sUninstallPath & "\" & sSubkey, "DisplayName", 
14.
sAppName 
15.
WScript.Echo sAppName 
16.
Next

Ich möchte nun dieses Array auf Vorhandensein einer bestimmten Software abfragen um im Anschluß die Software ggf. zu installieren. In der WMI Klasse "WIN32_Product" wird die Software leider nicht gelistet - hier wäre bei Vorhandensein die Abfrage einfacher:

01.
strComputer = "." 
02.
 
03.
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") 
04.
Set colItems = objWMIService.ExecQuery ("Select * from Win32_Product WHERE Name = 'Name der Software'") 
05.
Set objWshShell = WScript.CreateObject("WScript.Shell") 
06.
 
07.
strInstall = "Installationsbefehl" 
08.
 
09.
If colItems.Count <1 Then 
10.
	objWshShell.Run strInstall, 0, True 
11.
End If
Vielen Dank für Eure Hilfe.
Torsten
Mitglied: bastla
06.12.2007 um 16:09 Uhr
Hallo appleseed!

Soferne ich Dich richtig verstehe, willst Du den ausgelesenen "sAppName" auf den Namen einer bestimmten Software hin untersuchen. Am Beispiel von "Opera" könnte das so aussehen:
01.
Const SW = "Opera" 
02.
Const HKCR = &H80000000 
03.
Const HKCU = &H80000001 
04.
Const HKLM = &H80000002 
05.
 
06.
Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & ".\root\default:StdRegProv") 
07.
 
08.
sUninstallPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" 
09.
 
10.
oReg.EnumKey HKLM, sUninstallPath, aSubkeys 
11.
 
12.
iSWLen = Len(SW) 
13.
sSW = LCase(SW) 
14.
 
15.
On Error Resume Next 
16.
For Each sSubkey In aSubkeys 
17.
	oReg.GetStringValue HKLM, sUninstallPath & "\" & sSubkey, "DisplayName",sAppName 
18.
	If Left(LCase(sAppName), iSWLen) = sSW Then WScript.Echo sAppName 
19.
Next
Verglichen wird jeweils nur der Anfang des gelesenen SW-Namens, wobei durch die Verwendung von LCase() die Unterscheidung Groß- / Kleinschreibung aufgehoben wird. Damit die Umwandlung und Längenbestimmung für den Suchbegriff nicht bei jedem Schleifendurchlauf erfolgt, werden die entsprechenden Werte bereits vor der Schleife ermittelt.

Grüße
bastla
Bitte warten ..
Mitglied: appleseed
08.12.2007 um 08:59 Uhr
Hallo bastla,

vielen Dank für Deine Hilfe, aber es ist nicht ganz das, was ich suche. Den exakten Namen der Software kenne ich ja bereits. Das Problem ist nur, ich muss die Installation der Software zur Ausführung bringen, wenn sie in dem Array nicht vorhanden ist. Und hier liegt das Problem - bei einigen hundert Installationen würde die Installationsanweisung jedes mal aufgerufen, wenn die If-Anweisung den Namen nicht findet.

Ich hab's jetzt so gelöst:

01.
For Each sSubkey In aSubkeys 
02.
oReg.GetStringValue HKLM, sUninstallPath & "\" & sSubkey, "DisplayName", sAppName 
03.
	Select Case sAppName 
04.
		Case "Name der Software" 
05.
		counter = counter + 1 
06.
	End Select 
07.
Next 
08.
 
09.
If counter < 1 Then 
10.
	'Aktion: "Software muss noch installiert werden" 
11.
	Else 
12.
	'Aktion: "Software ist bereits installiert" 
13.
End If
Gruß

Torsten
Bitte warten ..
Mitglied: bastla
08.12.2007 um 10:29 Uhr
Hallo appleseed!

Sorry - für mich hatte es eher danach geklungen, als ob das Vergleichen das Problem wäre ...

Noch zwei Anmerkungen:

Eine eher "kosmetische" Sache: Was Du eigentlich brauchst, ist ein Schalter (flag), aus dessen Zustand nach der Schleife ersichtlich ist, ob die Software gefunden wurde. Dein Zähler tut's natürlich auch, aber da die Anzahl eigentlich ohnehin nur 0 oder 1 ergeben sollte, kannst Du den Rechenschritt einsparen.

Zum Thema "Einsparen" allerdings ein weiterer Vorschlag: Sobald das gesuchte Programm gefunden wurde, ist es nicht mehr nötig, die weiteren ausgelesenen Programmnamen zu vergleichen.

Das Ganze sähe dann etwa so aus:
01.
bFound = False 
02.
For Each sSubkey In aSubkeys 
03.
oReg.GetStringValue HKLM, sUninstallPath & "\" & sSubkey, "DisplayName", sAppName 
04.
	If sAppName = "Name der Software" Then 
05.
		bFound = True 
06.
		Exit For 
07.
	End If 
08.
Next 
09.
 
10.
If Not bFound Then 
11.
	'Aktion: "Software muss noch installiert werden" 
12.
	Else 
13.
	'Aktion: "Software ist bereits installiert" 
14.
End If
Grüße
bastla
Bitte warten ..
Ähnliche Inhalte
Datenbanken
gelöst MS SQL Abfragen und Formulare in Webseite einbinden (3)

Frage von Machello zum Thema Datenbanken ...

Batch & Shell
gelöst Registry per Batch abfragen und INI Einträge hinzufügen bzw. ändern (18)

Frage von kampen zum Thema Batch & Shell ...

Netzwerkmanagement
gelöst Extreme Switche Portbelegung abfragen (10)

Frage von Ghost108 zum Thema Netzwerkmanagement ...

Neue Wissensbeiträge
Batch & Shell

Batch als Dienst bei Systemstart ohne Anmeldung ausführen

(2)

Tipp von tralveller zum Thema Batch & Shell ...

Sicherheits-Tools

Sicherheitstest von Passwörtern für ganze DB-Tabellen

(1)

Tipp von gdconsult zum Thema Sicherheits-Tools ...

Peripheriegeräte

Was beachten bei der Wahl einer USV Anlage im Serverschrank

(9)

Tipp von zetboxit zum Thema Peripheriegeräte ...

Heiß diskutierte Inhalte
Exchange Server
Exchange 2016 Standard Server 2012 R2 Hetzner Mail (36)

Frage von Datsspeed zum Thema Exchange Server ...

Windows 7
gelöst Lokales Adminprofil defekt (25)

Frage von Yannosch zum Thema Windows 7 ...

Verschlüsselung & Zertifikate
Mit Veracrypt eine zweite interne (non-system) Festplatte verschlüsseln (11)

Frage von Bernulf zum Thema Verschlüsselung & Zertifikate ...

Internet Domänen
Nameserver ein Geist? (9)

Frage von zelamedia zum Thema Internet Domänen ...