none
Поиск ветки реестра по фильтру/маске (VBScript, PowerShell) RRS feed

  • Вопрос

  • Всем доброго времени суток!

    Прошу помочь в следующем вопросе: нужно найти все ветки реестра, содержащие в своем названии "TeamViewer", посредством кода на VBScript. Поиск нужно вести в разделе "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall".

    Основная цель - удалить все версии TeamViewer. Строки удаления хочу брать в реестре. Проблема в том, что для каждой версии ветки называются по-разному: TeamViewer 7, TeamViewer 8 и т.п.

    Удалять планирую следующим способом: организовать цикл поиска веток, содержащих "TeamViewer", для каждой найденной - запросить значение параметра UninstallString, и запустить его с "тихими" ключами (в моем случае /S).

    Или еще лучше - в цикле сразу найти значения UninstallString, типа: "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\TeamViewer **(маска или фильтр)\UninstallString"

    Возможно, у кого-то уже есть аналогичный опыт, но другими методами - прошу поделиться.

    Буду признателен за помощь!



    • Перемещено Vector BCOModerator 3 марта 2016 г. 22:05 более подходящая тема
    • Изменено Oleg Kyba 4 марта 2016 г. 14:23
    3 марта 2016 г. 22:02

Ответы

  • const HKEY_LOCAL_MACHINE = &H80000002
    
    strComputer = "."
    
    set oWsh = createobject("wscript.shell")
    
    Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" _ 
         & strComputer & "\root\default:StdRegProv")
     
    strKeyPath = "software\microsoft\windows\currentversion\uninstall" ' Root level
    oReg.EnumKey HKEY_LOCAL_MACHINE, strKeyPath, arrSubKeys
    
    sMatch = "TeamViewer"
    For Each subkey In arrSubKeys
     on error resume next
     sDisplayName = oWsh.Regread("HKLM\" & strKeyPath & "\" & subkey & "\DisplayName")
     if err.number = 0 then 
      on error goto 0
      if instr(sDisplayName, sMatch) > 0 then
       On Error Resume Next
       sUninstall = oWsh.Regread("HKLM\" & strKeyPath & "\" & subkey & "\UnInstallString")
       If Err.Number = 0 Then
        ustr = """" & sUnInstall & """" & " /S"
    	oWsh.Run ustr, 1, True
       End If
       On Error GoTo 0
      end if
     end if
    Next
    on error goto 0
    

    • Помечено в качестве ответа Oleg Kyba 4 марта 2016 г. 14:23
    4 марта 2016 г. 12:50
    Отвечающий

Все ответы

  • Вам VBS принципиален или PowerShell тоже пойдет?

    The opinion expressed by me is not an official position of Microsoft

    3 марта 2016 г. 22:06
    Модератор
  • strComputer = "."
    Set objWMIService = GetObject("winmgmts:" _
        & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    
    Set colSoftware = objWMIService.ExecQuery _
        ("Select * from Win32_Product Where Name Like '%TeamViewer%'")
    For Each objSoftware in colSoftware
        objSoftware.Uninstall()
    Next

    4 марта 2016 г. 7:01
    Отвечающий
  • strComputer = "."
    Set objWMIService = GetObject("winmgmts:" _
        & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    
    Set colSoftware = objWMIService.ExecQuery _
        ("Select * from Win32_Product Where Name Like '%TeamViewer%'")
    For Each objSoftware in colSoftware
        objSoftware.Uninstall()
    Next

    Отличный вариант, но не в моем случае ((. Он подойдет для приложений, использующих установщик Windows Installer.

    TeamViewer использует "Nullsoft Install System", и таким образом не определяется. Проверил через wmic:

    C:\Windows\system32>wmic product where "name like '%TeamViewer%'"
    No Instance(s) Available.

    Пока вижу единственный способ - использовать строку удаления из реестра.

    Поодозреваю, PowerShell не подойдет по тем же причинам.

    Вопрос еще актуален.


    • Изменено Oleg Kyba 4 марта 2016 г. 8:09
    4 марта 2016 г. 8:05
  • const HKEY_LOCAL_MACHINE = &H80000002
    
    strComputer = "."
    
    set oWsh = createobject("wscript.shell")
    
    Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" _ 
         & strComputer & "\root\default:StdRegProv")
     
    strKeyPath = "software\microsoft\windows\currentversion\uninstall" ' Root level
    oReg.EnumKey HKEY_LOCAL_MACHINE, strKeyPath, arrSubKeys
    
    sMatch = "TeamViewer"
    For Each subkey In arrSubKeys
     on error resume next
     sDisplayName = oWsh.Regread("HKLM\" & strKeyPath & "\" & subkey & "\DisplayName")
     if err.number = 0 then 
      on error goto 0
      if instr(sDisplayName, sMatch) > 0 then
       On Error Resume Next
       sUninstall = oWsh.Regread("HKLM\" & strKeyPath & "\" & subkey & "\UnInstallString")
       If Err.Number = 0 Then
        ustr = """" & sUnInstall & """" & " /S"
    	oWsh.Run ustr, 1, True
       End If
       On Error GoTo 0
      end if
     end if
    Next
    on error goto 0
    

    • Помечено в качестве ответа Oleg Kyba 4 марта 2016 г. 14:23
    4 марта 2016 г. 12:50
    Отвечающий
  • Спасибо большое! Все работает!

    И насчет PowerShell я ошибался - им тоже можно сделать аналогичную проверку, причем выходит очень лаконично:

    $Query = Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\* | ? {$_.PSChildName -match 'TeamViewer'} | select -ExpandProperty UninstallString
    ForEach ($DelString in $Query) {
        if (Test-Path $DelString) {
            & $DelString /S
        }
    }

    4 марта 2016 г. 14:23