1

winregを使用して、次のレジストリ調整をpythonに変換しようとしています:

REGEDIT4
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\IniFileMapping\Autorun.inf]
@="@SYS:Does_Not_Exist"

痛みは、再現できないように見える「@」にあります。C# の例を見ると、たとえば空の文字列 '' を使用して @ を入力しています。上記を手動でインポートして winreg の EnumValue() を使用すると、このエントリも '' として表示されます。しかし、python winreg で同様のことを行うことはできないようで、これまでのところ回避策は見つかりませんでした。

問題を示すコード:

from winreg import *
import os
import platform

import sys, time
import win32api as wa, win32con as wc, win32service as ws

def registrySetKey(hive, regpath, key, type, value):
    try:
        reg = OpenKey(hive, regpath, 0, KEY_ALL_ACCESS)
    except EnvironmentError:
        try:
            reg = CreateKey(hive, regpath, 0, KEY_ALL_ACCESS)
            SetValueEx(reg, key, None, type, value)
            CloseKey(reg)
        except:
            print("*** Unable to register path %s, key %s!" % (regpath, key))
            return
        print("--- Python", version, "is now registered!")
        return
    try:
        if (QueryValue(reg, key) == value):
            return
    except:
        SetValueEx(reg, key, None, type, value)
    CloseKey(reg)


reg = CreateKey(HKEY_LOCAL_MACHINE, r'Software\Microsoft\Windows NT\CurrentVersion\IniFileMapping\Autorun.inf')

# This does not work
registrySetKey(HKEY_LOCAL_MACHINE, 
               r'Software\Microsoft\Windows NT\CurrentVersion\IniFileMapping\Autorun.inf', 
               '', REG_SZ, '@SYS:Does_Not_Exist')

手動でインポートした後、エントリの名前は (デフォルト) になり、それを使用しても機能しません。

よろしく、スヴェン

4

1 に答える 1

0

使用している関数は呼び出しで機能しますが、値が現在一致していない場合、つまり現在実際には何も設定していない場合に備えて、次を追加する必要があります。

else:
    SetValueEx(reg, key, None, type, value)

したがって、完全な関数は次のようになります。

from winreg import *
import os
import platform

import sys, time
import win32api as wa, win32con as wc, win32service as ws

def registrySetKey(hive, regpath, key, type, value):
    try:
        reg = OpenKey(hive, regpath, 0, KEY_ALL_ACCESS)
    except EnvironmentError:
        try:
            reg = CreateKey(hive, regpath, 0, KEY_ALL_ACCESS)
            SetValueEx(reg, key, None, type, value)
            CloseKey(reg)
        except:
            print("*** Unable to register path %s, key %s!" % (regpath, key))
            return
        print("--- Python", version, "is now registered!")
        return
    try:
        if (QueryValue(reg, key) == value):
            return
        else:
            SetValueEx(reg, key, None, type, value)     # added
    except:
        SetValueEx(reg, key, None, type, value)
    CloseKey(reg)


reg = CreateKey(HKEY_LOCAL_MACHINE, r'Software\Microsoft\Windows NT\CurrentVersion\IniFileMapping\Autorun.inf')

registrySetKey(HKEY_LOCAL_MACHINE, 
               r'Software\Microsoft\Windows NT\CurrentVersion\IniFileMapping\Autorun.inf', 
               '', REG_SZ, '@SYS:Does_Not_Exist') 

Windows のバージョンによっては、これを実行した結果、次のキーが変更されている可能性があります。

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\IniFileMapping\Autorun.inf
于 2016-03-04T11:52:35.027 に答える