花了三天時間,修改前人寫的舊版VBScript,己可以準確抓取Windows控制台新增移除程式內已安裝軟體。會修改的理由,為了避免常至使用者電腦查詢軟體,造成使用者的不便以及增進工作效率。測試Windows平台為Windows XP和Windows 7 64位元

VBScript程式如下:

Set WshShell = CreateObject( "WScript.Shell")
Set oFSO = CreateObject("Scripting.FileSystemObject")

Const ForReading = 1, ForWriting = 2, ForAppending = 8
Const HKLM = &H80000002 'HKEY_LOCAL_MACHINE
Const HKCU = &H80000001 'HKEY_CURRENT_USER

strComputer = "."

'查詢電腦名稱
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_OperatingSystem")
For Each objItem in colItems    
    strComputerName = objItem.CSName
Next

outputname="d:\" & strComputerName  & ".csv"

set output = oFSO.OpenTextFile(outputname,ForWriting,true,-1)

returncode=0

Set oReg1=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
 
strKeyPath1 = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
oReg1.EnumKey HKCU, strKeyPath1, arrSubKeys

if err.number <> 0 then
   wscript.quit(err.number)
end if
        
For Each subkey In arrSubKeys
         displayname=""
         DisplayVersion = ""
         InstallDate = ""
         UninstallString = ""

         strKeyPath1 = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" & "\" & subkey
         strValueName = "DisplayName"
         oReg1.GetStringValue HKCU,strKeyPath1,strValueName,strValue
         DisplayName = strValue
         if ("" & strValue) <> "" then
            strValueName = "DisplayVersion"
            oReg1.GetStringValue HKCU,strKeyPath1,strValueName,strValue
            DisplayVersion = strValue   

            strValueName = "InstallDate"
            oReg1.GetStringValue HKCU,strKeyPath1,strValueName,strValue
            InstallDate = strValue    
               
            output.writeline DisplayName & ";" & DisplayVersion & ";" & InstallDate   
            appcount=appcount+1
         end if
        Next
        
        Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
 
           strKeyPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
           oReg.EnumKey HKLM, strKeyPath, arrSubKeys

           if err.number <> 0 then
              wscript.quit(err.number)
           end if

        For Each subkey In arrSubKeys
            displayname=""
            DisplayVersion = ""
            InstallDate = ""
            UninstallString = ""
            
        if left(subkey,2)<>"KB" THEN

            strKeyPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" & "\" & subkey
            strValueName = "DisplayName"
            oReg.GetStringValue HKLM,strKeyPath,strValueName,strValue
            DisplayName = strValue
             if ("" & strValue) <> "" then
               strValueName = "DisplayVersion"
               oReg.GetStringValue HKLM,strKeyPath,strValueName,strValue
               DisplayVersion = strValue   

               strValueName = "InstallDate"
               oReg.GetStringValue HKLM,strKeyPath,strValueName,strValue
               InstallDate = strValue

               strValueName = "UninstallString"
               oReg.GetStringValue HKLM,strKeyPath,strValueName,strValue
               UninstallString = strValue
               if not isnull(strValue) then                 
                  strValueName = "ReleaseType"
                  oReg.GetStringValue HKLM,strKeyPath,strValueName,strValue
                  ReleaseType = strValue               
                  If isnull(strValue) then  
                     strValueName = "SystemComponent"
                     oReg.GetDWORDValue HKLM,strKeyPath,strValueName,strValue
                     SystemComponent = strValue
                     if isnull(strValue) or strValue=0 then
                        output.writeline DisplayName & ";" & DisplayVersion
                     end if
                  End if
               end if             
             end if
         end if
        Next


'判斷電腦cpu64位元,列出windows 7 64位元安裝軟體

Set objWMIService1 = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
Set colItems1 = objWMIService1.ExecQuery("SELECT * FROM Win32_Processor")
For Each objItem1 in colItems1
    If objItem1.AddressWidth="64" then 'CPU 64位元電腦
              Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
 
           strKeyPath = "SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall"
           oReg.EnumKey HKLM, strKeyPath, arrSubKeys

           if err.number <> 0 then
              wscript.quit(err.number)
           end if

        FOR EACH subkey IN arrSubKeys
            displayname=""
            DisplayVersion = ""
            InstallDate = ""
            UninstallString = ""

            strKeyPath = "SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" & "\" & subkey
            strValueName = "DisplayName"
            oReg.GetStringValue HKLM,strKeyPath,strValueName,strValue
            DisplayName = strValue
            IF ("" & strValue) <> "" AND left(strValue,15)<>"Security Update" and left(strValue,17)<>"Definition Update"  and  left(strValue,6)<>"Update"THEN
               strValueName = "DisplayVersion"
               oReg.GetStringValue HKLM,strKeyPath,strValueName,strValue
               DisplayVersion = strValue

               strValueName = "InstallDate"
               oReg.GetStringValue HKLM,strKeyPath,strValueName,strValue
               InstallDate = strValue

               strValueName = "UninstallString"
               oReg.GetStringValue HKLM,strKeyPath,strValueName,strValue
               UninstallString = strValue
               IF NOT isnull(strValue) THEN                 
                  strValueName = "SystemComponent"
                  oReg.GetDWORDValue HKLM,strKeyPath,strValueName,strValue
                  SystemComponent = strValue               
                  IF isnull(strValue) THEN                       
                     output.writeline DisplayName & ";" & DisplayVersion
                  END IF
               END IF                    
           END IF
        NEXT            
    END IF
NEXT

if err.number<>0 then
    returncode=err.number
    wscript.quit(returncode)
end if    

output.close


' cleanup
set oFSO=nothing
set Wshshell=nothing

wscript.quit(returncode)

arrow
arrow

    JojoChen 發表在 痞客邦 留言(0) 人氣()