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, 5755 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 ...

LAN, WAN, Wireless

Gezielt zu Acesspoint verbinden bei gleichen SSIDs

Frage von Quartz234LAN, WAN, Wireless11 Kommentare

Hallo zusammen, ich suche ein Tool mit welchem ich, wenn mehrere WLAN-Netzwerke/Acess-Points mit gleicher SSID vorhanden sind, mich gezielt ...

Neue Wissensbeiträge
LAN, WAN, Wireless

UniFi - UAP Antenna Radiation Patterns - WLAN Ausstrahlungsmuster

Information von StefanKittel vor 6 StundenLAN, WAN, Wireless

Hallo, wer sich schon immer mal gefragt hat wie der Unterschied in den WLAN Access Points bei Unifi wirklich ...

Windows Userverwaltung

Passwortwechsel in der Domain bei Anmeldung erzwingen

Anleitung von Looser27 vor 16 StundenWindows Userverwaltung6 Kommentare

Nachdem es immer wieder User geschafft haben, sich während des laufenden Betriebes auszusperren, habe ich nach einer Möglichkeit gesucht, ...

Ausbildung

Linux-Ausstieg in Niedersachsen - Windows statt Bugfix

Information von StefanKittel vor 3 TagenAusbildung40 Kommentare

Sind ja nur Steuergelder

Speicherkarten

Neuer Speicherkartentyp - zunächst nur für Huawei-Smartphones (künftig auch für Notebooks u. Tablets?)

Tipp von VGem-e vor 5 TagenSpeicherkarten6 Kommentare

Servus, als ob das "Chaos" i.S. Speicherkarten noch nicht groß genug wäre?! Evtl. kommt dieser neue Kartentyp bald auch ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Passwortwechsel Zeitpunkt festlegen
gelöst Frage von Looser27Windows Userverwaltung32 Kommentare

Guten Morgen liebe Kolleginnen und Kollegen, da es eine Userin in meinem Urlaub geschafft hat, sich vom AD vollständig ...

Microsoft
Netzlaufwerksordner Berechtigungen Speichern unter aus Programmen
gelöst Frage von ITler7Microsoft19 Kommentare

Moin, bin in ein neues Unternehmen eingetreten und habe die Anforderung bekommen Berechtigungen auf einige Ordner anzupassen, da bisher ...

Windows Server
Probleme im AD am Außenstandort
gelöst Frage von emeriksWindows Server19 Kommentare

Hi, wir haben ein Problem mit AD und GPO am Außenstandort und ich stehe momentan mächtig auf dem Schlauch. ...

Flatrates
Geschwindikeitsprobleme zwischen 1 und 1 - Vodafone Heimnetz
Frage von muenchhausenFlatrates15 Kommentare

Moin erstmal, Vorweg mein Setup 1. Wohnsitz Vodafone 400K Leitung (kommt sogar komplett an, auch um 18 Uhr) 2. ...