Top-Themen

Aktuelle Themen (A bis Z)

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

Mitglied: appleseed

appleseed (Level 1) - Jetzt verbinden

06.12.2007, aktualisiert 08.12.2007, 5743 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
Entwicklung

Powershell: Werte aus Array gezielt auslesen

gelöst Frage von SunnyRainyDayEntwicklung3 Kommentare

Hallo, Stehe ein wenig auf´m Schlauch. Ich möchte aus einem Array nur den Wert eines Feldes auslesen. Also z.b. ...

PHP

Mit PHP SQL Array Abfrage

gelöst Frage von gamerffPHP3 Kommentare

Hallo Forum, ich bin grade an einem Projekt dran ein Telefonbuch mit Mysql, PHP und HTMl zu erstellen. Ich ...

Windows Netzwerk

Gezielt nach MAC-Adresse im DHCP suchen

gelöst Frage von BuffedITHeadWindows Netzwerk10 Kommentare

Vorab hallo erstmal Community, ich bin neu hier im Forum. Ich habe unter den original Thread gepostet, allerdings ist ...

Batch & Shell

Leere Array-Werte aus einem Array entfernen

gelöst Frage von ToniHoBatch & Shell3 Kommentare

Hallo zusammen, ich bin dabei ein Powershell-Script zu schreiben, welches diverse Reports generieren kann. Für die Eingabe von SamAccountNames ...

Neue Wissensbeiträge
SAN, NAS, DAS
QNAP NAS Datenschutz-Loop nach Firmware-Update
Tipp von vanTast vor 16 StundenSAN, NAS, DAS2 Kommentare

Moin, im allgemeinen Trend seine geänderten Datenschutzbedingungen den Kunden zukommen zu lassen kam die Firma QNAP auf die glorreiche ...

Datenschutz
DSGVO Datenschutzgesetz
Anleitung von 1Werner1 vor 17 StundenDatenschutz4 Kommentare

Moin, ja was ist das, da ist die DSGVO Datenschutzverordnung. Wie das Gesetz gibt es schon 2 Jahre? Nun ...

CPU, RAM, Mainboards
Neverending story
Tipp von keine-ahnung vor 1 TagCPU, RAM, Mainboards1 Kommentar

Da kommt man mit dem fixen gar nicht mehr hinterher und die CPU erreichen wieder Rechenleistungen im Bereich des ...

Multimedia & Zubehör
AVM Fritz USB WLAN Sticks schneller einschalten
Tipp von NetzwerkDude vor 3 TagenMultimedia & Zubehör4 Kommentare

Die AVM Fritz WLAN Sticks haben in der Firmware 2 Modis: Einmal als Massenspeicher und einmal als WLAN Netzwerkkarte ...

Heiß diskutierte Inhalte
PHP
Nach Umzug zu 1und1 bekomme ich beim Eintrag in die DB Tabelle folgenden Fehler
gelöst Frage von jensgebkenPHP35 Kommentare

INSERT command denied to user 'dbo45342345342231244'@'112.127.102.073' for table 'orders'

LAN, WAN, Wireless
Powerline über zwei Stockwerke optimieren
gelöst Frage von DultusLAN, WAN, Wireless33 Kommentare

Guten Morgen liebes Forum, ich hätte einmal eine Frage bezüglich Powerline Adapter: Mein Problem ist seit gestern präsent, da ...

Windows Userverwaltung
Problem mit Benutzerprofil
Frage von lieferscheinWindows Userverwaltung24 Kommentare

Guten Tag liebe Community, folgendes Problem habe ich: User meldet sich auf Client A an - sein Homelaufwerk verbindet. ...

Off Topic
DISKUSSION: Was bringt der Disclaimer "Wenn Sie nicht der Empfänger sind."
Frage von N8DragonOff Topic21 Kommentare

So oder ähnlich, lese ich immer wieder Kleingedrucktes am Ende diverser Mails. Letzten Endes wollen sie mir alle sagen, ...