WMI Win32_Product on Windows 2003 returns error

Hallo zusammen,

Ich wollte ein VBS Script laufen lassen, um die installierte Software auf allen Servern aufszulesen. Nur hat dieses Script nur die Daten von Windows 2000 und Windows 2008 Servern ausgelesen, bei Windows 2003 Servern hat dies aber nicht funktioniert und mit der untenstehenden Fehlermeldung quittiert.

strComputer = "servername"

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_Product")

For Each objItem in colItems
            msgbox "Name: " & objItem.Name
Next

Interessant war aber, dass eine WMI Abfrage des Betriebsystems aber funktioniert.

strComputer = "servername"

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")

For Each objItem in colItems
           msgbox "Caption: " & objItem.Caption
           msgbox "BuildNumber: " & objItem.BuildNumber
           msgbox "ServicePackMajorVersion: " & objItem.ServicePackMajorVersion
           msgbox "ServicePackMinorVersion: " & objItem.ServicePackMinorVersion
           msgbox "Version: " & objItem.Version
Next

Die Lösung ist eigentlich einfach - unter Windows 2003 muss das Packet "WMI Windows Installer Provider" installiert werden.

Und hier noch das ganze Script.

'##############################################################################
'# Software Inventory through WMI and Registry
'# 08.06.2010 Andres Bohren - Initial Version WMI + Registry
'# 09.06.2010 Andres Bohren/Kieliger Martin - Computers aus AD auslesen
'##############################################################################

On Error Resume Next
CONST BaseDN = "DC=corp,DC=icewolf,DC=ch"

'#List All Computers in Domain
GetComputers()


Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(".\SWInventory.txt", 2, True)

If objFSO.Fileexists(".\computers.txt") = TRUE then

 Set objComputers = objFSO.OpenTextFile(".\computers.txt", 1)
 Do While ObjComputers.AtEndOfStream <> True
  strComputer = ObjComputers.readline
  GetOS(strComputer)
  GetSoftware(strComputer)
  GetSoftwareRegistry(strComputer)
 Loop
End if


objFile.close
set objFile = nothing
Set objFSO = nothing

msgbox "Fertisch..."

'##############################################################################
Function GetOS(strComputer)
'##############################################################################
' Write Hostname and OS Information to Logfile

objFile.WriteLine "----------------------------------------------------------------------"
objFile.WriteLine "Hostname: " & strComputer
objFile.WriteLine "----------------------------------------------------------------------"

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colOS = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")
For Each objOS in colOS
 objFile.WriteLine "Version: " & objOS.Caption
 objFile.WriteLine "BuildNumber: " & objOS.BuildNumber & " ServicePack: " & objOS.ServicePackMajorVersion
Next
objFile.WriteLine " "

End Function


'##############################################################################
Function GetSoftware(strComputer)
'##############################################################################
' Get Installed Software throug WMI Win32_Product and write Info to Logfile

 Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
 
 '# Ausgelesen über Win32_Product
 objFile.WriteLine "Software aus Win32_Product:"
 objFile.WriteLine "***************************"
 Set colItems = objWMIService.ExecQuery("Select * from Win32_Product")
 
 For Each objItem in colItems
  objFile.WriteLine "Name: " & objItem.Name
  objFile.WriteLine "Vendor: " & objItem.Vendor
  objFile.WriteLine "Version: " & objItem.Version
  objFile.WriteLine " " 
 Next
End Function


'##############################################################################
Function GetSoftwareRegistry(strComputer)
'##############################################################################
' Get Installed Software throug WMI Registry and write Info to Logfile

 Const HKLM = &H80000002
 Const strBaseKey = "Software\Microsoft\Windows\CurrentVersion\Uninstall\"
 Set objReg = GetObject("winmgmts://" & strComputer & "/root/default:StdRegProv")
 DoNotList = 0
 
 '# Ausgelesen über Registry
 objFile.WriteLine "Software aus Registry:"
 objFile.WriteLine "**********************"
 
 objReg.EnumKey HKLM, strBaseKey, arrSubKeys
  For Each strSubKey In arrSubKeys
     intRet = objReg.GetStringValue(HKLM, strBaseKey & strSubKey, "DisplayName", strValue)
     If intRet <> 0 Then
         intRet = objReg.GetStringValue(HKLM, strBaseKey & strSubKey, "QuietDisplayName", strValue)
     End If
     If (strValue <> "") and (intRet = 0) Then
         'str=str & strValue &vbcrlf
        
     If instr(strValue,"Security Update") > 0 then
      DoNotList = 1
     end if
        
     If instr(strValue,"Update for") > 0 then
      DoNotList = 1
     end if

     If instr(strValue,"Hotfix") > 0 then
      DoNotList = 1
     end if

     If DoNotList = 0 then
      objFile.WriteLine strValue
     end if

     End If
 Next
End Function


'##############################################################################
Function GetComputers()
'##############################################################################
' Get All Computers from BaseDN and write to "computers.txt"
 
 Const ADS_SCOPE_SUBTREE = 2
 
 Set objConnection = CreateObject("ADODB.Connection")
 Set objCommand =   CreateObject("ADODB.Command")
 objConnection.Provider = "ADsDSOObject"
 objConnection.Open "Active Directory Provider"
 
 Set objCOmmand.ActiveConnection = objConnection
 objCommand.CommandText = "Select Name, Location from 'LDAP://" & BaseDN & "' Where objectClass='computer'" 
 'objCommand.CommandText = "Select Name, Location from 'LDAP://OU=Server,OU=MSC_ZH,DC=CNS-ZRH,DC=AD,DC=PROD' Where objectClass='computer'" 
 objCommand.Properties("Page Size") = 1000
 objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
 Set objRecordSet = objCommand.Execute

 objRecordSet.MoveFirst
 
 Set objFSO2 = CreateObject("Scripting.FileSystemObject")
 Set objComp = objFSO2.OpenTextFile(".\computers.txt", 2, True)
 
 Do Until objRecordSet.EOF
     'Wscript.Echo "Computer Name: " & objRecordSet.Fields("Name").Value 
     objComp.WriteLine objRecordSet.Fields("Name").Value
     objRecordSet.MoveNext
 Loop
 
 objComp.close
 set objComp = nothing

End Function

Uns so sieht dann das Resultat aus:

Grüsse
Andres Bohren