Не удается найти запись реестра Windows, но она видна в regedit - PullRequest
0 голосов
/ 27 октября 2018

Я ищу строку удаления для определенного издателя, чтобы автоматизировать удаление некоторого программного обеспечения.Я вижу запись в regedit.Я ищу как 64-битные, так и 32-битные представления реестра, как видно из моего кода.Я вижу приложение в разделе «Установка и удаление программ».Программное обеспечение публикуется Институтом исследований окружающей среды, Inc. Я искал все и не могу понять, почему я не могу найти этот ключ с моим кодом.Любая помощь будет оценена.В функции getUninstallers есть оператор if, закомментированный в первом блоке try, который имеет фактическое имя ключа, которое я пытаюсь найти.Ниже кода я включил снимок экрана regedit с видимым ключом.

import winreg 
aKeyName = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall"
bKeyName = "SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall"

def getUninstallers(keyName, bitView):
    if ( bitView == 32 ):
        key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, keyName, 0,
                (winreg.KEY_WOW64_32KEY + winreg.KEY_READ))
    elif ( bitView == 64 ):
        key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, keyName, 0,
                (winreg.KEY_WOW64_64KEY + winreg.KEY_READ))
    subKeyIndex = 0
    subkeys = list()
    while True:
        try:
            subKeyName = winreg.EnumKey(key,subKeyIndex)
            #if(subKeyName.count(r'{D43E583A-A698-4227-8F83-3084172F12F0}') > 0):
            #    print(subKeyName)
            subKey = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, keyName +
                        "\\" + subKeyName)
            valueIndex = 0
            subKeyList = list()
            while True:
                try:
                    aValue = winreg.EnumValue(subKey,valueIndex)
                    if(aValue[0] == 'Publisher' or 
                       aValue[0] == 'UninstallString'):
                        subKeyList.append(aValue)
                    valueIndex+=1
                except OSError:#[WinError 259] No more data is available
                    #These errors are supposed to happen, see winreg 
                    #documentation at docs.python.org/3/library/winreg.html
                    break
            if(len(subKeyList) > 0):
                subkeys.append(subKeyList)
            subKeyIndex += 1
        except OSError:#[WinError 259] No more data is available
            #These errors are supposed to happen, see winreg documentation
            #at docs.python.org/3/library/winreg.html
            break
    return subkeys

def getUninstallersByPublisher(publisher):
    theKeys = [getUninstallers(aKeyName, 32), 
               getUninstallers(bKeyName, 32), 
               getUninstallers(aKeyName, 64), 
               getUninstallers(bKeyName, 64)]
    uninstallers = list()
    for aKey in theKeys:
        for subKey in aKey:
            for aValue in subKey:
                for aString in aValue:
                    if(str(aString).count(publisher) > 0):
                        print("Found key for publisher: " + publisher)
                        for someValue in subKey:
                            for someString in someValue:
                                if(str(someString).count("Uninstall") > 0):
                                    try:
                                        print("Found UninstallString: " +
                                            someValue[1])
                                        uninstallers.append(someValue[1])
                                    except Exception as e:
                                        print("exception: " + str(e))
    # Delete duplicates in list                                        
    uninstallers = list(set(uninstallers))
    return uninstallers


print(getUninstallersByPublisher(
        "Environmental Systems Research Institute, Inc."))

Изображение regedit с видимым ключом

1 Ответ

0 голосов
/ 09 ноября 2018
import winreg
aKeyName = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall"

def getUninstallers(keyName, bitView):
    if ( bitView == 32 ):
        key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, keyName, 0,
         access=(winreg.KEY_WOW64_32KEY | winreg.KEY_READ))
    elif ( bitView == 64 ):
        key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, keyName, 0,
         access=(winreg.KEY_WOW64_64KEY | winreg.KEY_READ))
    subKeyIndex = 0
    subkeys = list()
    while True:
        try:
            subKeyName = winreg.EnumKey(key,subKeyIndex)
            if( bitView == 32 ):
                subKey = winreg.OpenKey(key, subKeyName, 0,
                  access=(winreg.KEY_WOW64_32KEY | winreg.KEY_READ))
            elif( bitView == 64 ):
                subKey = winreg.OpenKey(key, subKeyName, 0,
                  access=(winreg.KEY_WOW64_64KEY | winreg.KEY_READ))
            valueIndex = 0
            subKeyList = list()
            while True:
                try:
                    aValue = winreg.EnumValue(subKey,valueIndex)
                    if(aValue[0] == 'Publisher' or aValue[0] == 'UninstallString'):
                        subKeyList.append(aValue)
                    valueIndex+=1
                except OSError as e:#[WinError 259] No more data is available
                    # These errors are supposed to happen, see winreg documentation
                    # at docs.python.org/3/library/winreg.html
                    if str(e).count('WinError 259') is 0:
                        print("OSError 1: " + str(e) + "\r" + subKeyName)
                    break
            if(len(subKeyList) > 0):
                subkeys.append(subKeyList)
            subKeyIndex += 1
        except OSError as e:#[WinError 259] No more data is available
            # These errors are supposed to happen, see winreg documentation
            # at docs.python.org/3/library/winreg.html
            if str(e).count('WinError 259') is 0:
                print("OSError 2: " + str(e) + "\r" + subKeyName)
            break
    return subkeys

def getUninstallersByPublisher(publisher):
    theKeys = [getUninstallers(aKeyName, 32), getUninstallers(aKeyName, 64)]
    uninstallers = list()
    for aKey in theKeys:
        for subKey in aKey:
            for aValue in subKey:
                for aString in aValue:
                    if(str(aString).count(publisher) > 0):
                        print("Found key for publisher: " + publisher)
                        for someValue in subKey:
                            for someString in someValue:
                                if(str(someString).count("Uninstall") > 0):
                                    try:
                                        print("Found UninstallString: " + someValue[1])
                                        uninstallers.append(someValue[1])
                                    except Exception as e:
                                        print("exception: " + str(e))
    # Delete duplicates in list                                        
    uninstallers = list(set(uninstallers))
    return uninstallers

somePublisher = "Microsoft Corporation"
print(getUninstallersByPublisher(somePublisher))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...