WMI “installed” query different from add/remove programs list?

后端 未结 13 1791
不知归路
不知归路 2020-11-29 01:56

Trying to use WMI to obtain a list of installed programs for Windows XP. Using wmic, I tried:

wmic /output:c:\\ProgramList.txt product get name,version


        
相关标签:
13条回答
  • 2020-11-29 02:30

    All that Add/Remove Programs is really doing is reading this Registry key:

    HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall
    
    0 讨论(0)
  • 2020-11-29 02:30

    I adapted the MS-Technet VBScript for my needs. It dumps Wow6432Node as well as standard entries into "programms.txt" Use it at your own risk, no warranty!

    Save as dump.vbs

    From command line type: wscript dump.vbs

    Const HKLM = &H80000002
    Set objReg = GetObject("winmgmts://" & "." & "/root/default:StdRegProv")
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    
    outFile="programms.txt"
    
    Set objFile = objFSO.CreateTextFile(outFile,True)
    writeList "SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\", objReg, objFile
    writeList "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\", objReg, objFile
    objFile.Close 
    
    Function writeList(strBaseKey, objReg, objFile) 
    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
            objReg.GetStringValue HKLM, strBaseKey & strSubKey, "DisplayVersion", version
            objReg.GetStringValue HKLM, strBaseKey & strSubKey, "InstallDate", insDate 
            If (strValue <> "") and (intRet = 0) Then
                objFile.Write strValue & "," & version & "," & insDate & vbCrLf
            End If
        Next
    End Function
    
    0 讨论(0)
  • 2020-11-29 02:31

    You can use the script from http://technet.microsoft.com/en-us/library/ee692772.aspx#EBAA to access the registry and list applications using WMI.

    0 讨论(0)
  • 2020-11-29 02:35

    Besides the most commonly known registry key for installed programs:

    HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall

    wmic command and the add/remove programs also query another registry key:

    HKEY_CLASSES_ROOT\Installer\Products

    Software name shown in the list is read from the Value of a Data entry within this key called: ProductName

    Removing the registry key for a certain product from both of the above locations will keep it from showing in the add/remove programs list. This is not a method to uninstall programs, it will just remove the entry from what's known to windows as installed software.

    Since, by using this method you would lose the chance of using the Remove button from the add/remove list to cleanly remove the software from your system; it's recommended to export registry keys to a file before you delete them. In future, if you decided to bring that item back to the list, you would simply run the registry file you stored.

    0 讨论(0)
  • 2020-11-29 02:41

    Hope this helps somebody: I've been using the registry-based enumeration in my scripts (as suggested by some of the answers above), but have found that it does not properly enumerate 64-bit software when run on Windows 10 x64 via SCCM (which uses a 32-bit client). Found something like this to be the most straightforward solution in my particular case:

    Function Get-Programs($Bits) {
      $Result = @()
      $Output = (reg query HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall /reg:$Bits /s)
    
      Foreach ($Line in $Output) {
        If ($Line -match '^\s+DisplayName\s+REG_SZ\s+(.+?)$') {
          $Result += New-Object PSObject -Property @{
            DisplayName = $matches[1];
            Bits = "$($Bits)-bit";
          }
        }
      }
    
      $Result
    }
    
    $Software  = Get-Programs 32
    $Software += Get-Programs 64
    

    Realize this is a little too Perl-ish in a bad way, but all other alternatives I've seen involved insanity with wrapper scripts and similar clever-clever solutions, and this seems a little more human.

    P.S. Trying really hard to refrain from dumping a ton of salt on Microsoft here for making an absolutely trivial thing next to impossible. I.e., enumerating all MS Office versions in use on a network is a task to make a grown man weep.

    0 讨论(0)
  • 2020-11-29 02:42

    Not the best, but whether it is practical method:

    Use HijackThis.

    Run hijack this, click the "Open the Misc Tools section" button

    HijackThis Main Menu

    click "Open Uninstall Manager"

    HijackThis Configuration

    click save list (*.txt), yes to the prompts, notepad will open with your add/remove programs list.

    HijackThis Add/Remove Programs Manager


    Source

    0 讨论(0)
提交回复
热议问题