2016-03-04 17 views
1

Я пытаюсь преобразовать следующий твик реестра питона с помощью WinREG:создания записи «@» с питоном, используя WinREG

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

Боль в «@», который я не могу реплицировать. Рассматривая примеры на C#, они используют, например. пустую строку '', чтобы ввести @. Если я вручную импортирую вышеуказанное и использую EnumValue() из winreg, эта запись также отображается как ''. Но я не могу сделать что-то подобное в 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') 

После ручного импорта названия записи (по умолчанию), используя который также не работает.

С уважением, Sven

ответ

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 
+0

Спасибо, что сделал трюк. – sven

+0

Рад, что он решил вашу проблему. Не забудьте нажать на серый тик, чтобы принять ответ. –