python-3.x - HKEY_LOCAL_MACHINE 的 winreg.SetValueEx() 不创建密钥
问题描述
我正在尝试根据存储在 JSON 对象中的值设置注册表项。我在 HKEY_LOCAL_USER 中创建密钥没有问题。我尝试在 HKEY_LOCAL_MACHINE 中创建的任何内容都不会被创建。在有和没有管理员权限的情况下运行命令提示符时,密钥创建失败。运行 Python 3.8。
from winreg import *
import ctypes, json, sys, time
#Determine the version of PDM and the branch location.
settingsData = 'EPDM_Vault_settings.txt'
solidworksVersion = 'TEST'
branch = '02'
pdmConfig = solidworksVersion + '_' + branch #Used to select settings from EPDM_Vault_settings.txt
def is_admin():
try:
return ctypes.windll.shell32.IsUserAnAdmin()
except:
return False
def set_reg(key, subKey, name, regType, value):
try:
openKey=CreateKey(key, subKey)
SetValueEx(openKey, name, 0, regType, value)
CloseKey(openKey)
return False
except WindowsError:
print("\n**** error creating key for " + str(key) + ' > ' + str(subKey) + ' > ' + str(name) + ' > ' + str(regType) + ' > ' + str(value) + ' : ' + str(WindowsError))
return True
def get_key(v):
switcher={
"HKEY_CURRENT_USER": HKEY_CURRENT_USER,
"HKEY_LOCAL_MACHINE": HKEY_LOCAL_MACHINE
}
return switcher.get(v, False)
def get_regType(v):
switcher={
'REG_DWORD': 4,
'REG_SZ': 1,
}
return switcher.get(v, False)
def set_dataType(v, t):
if t == 'REG_DWORD':
return int(v)
elif t == 'REG_SZ':
return str(v)
else:
return False
def configure_settings():
with open(settingsData) as json_file:
data = json.load(json_file)
error = False
for p in data[pdmConfig]:
key = get_key(p['key'])
subKeys = p['subKeys']
for e in subKeys:
subKey = e['subKey']
settings = e['settings']
for i in settings:
name = i[0]
regType = get_regType(i[1])
value = set_dataType(i[2], i[1])
print(key, subKey, name, regType, value)
if key is not False and subKey is not False and value is not False:
error = set_reg(key, subKey, name, regType, value)
print(error)
else:
error = True
print('False detected at ' + str(key) + ' > ' + str(subKey) + ' > ' + str(name) + ' > ' + str(regType) + ' > ' + str(value))
if error == False:
print('\n****Success creating registry keys for SolidWorks EPDM configuration ' + pdmConfig + '\n')
else:
print('\n****WARNING: Registry key creation has failed. Check for typos and errors for configuration ' + pdmConfig + ' in ' + settingsData + '.\n')
print('****IMPORTANT: SolidWorks EPDM will not function propertly until the registry keys are created.\n')
if is_admin():
# Code of your program here
print('already running as admin')
configure_settings()
else:
# Re-run the program with admin rights
ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, __file__, None, 1)
print('switched to running as admin')
configure_settings()
JSON如下:
{
"TEST_02":[
{
"key": "HKEY_CURRENT_USER",
"subKeys": [
{
"subKey": "Software\\SolidWorks\\Solidworks 2017\\TEST FOLDER1",
"settings": [
["", "REG_SZ", "{ED78333F-D5DB-11D4-BD5A-00C04F019808}"]
]
},
{
"subKey": "Software\\SolidWorks\\Solidworks 2017\\TEST FOLDER2",
"settings": [
["the reg_sz", "REG_SZ", "some\\folder\\path"],
["the dword", "REG_DWORD", "123"]
]
}
]
},
{
"key": "HKEY_LOCAL_MACHINE",
"subKeys": [
{
"subKey": "SOFTWARE\\SolidWorks\\SOLIDWORKS 2017\\test folder",
"settings": [
["the dword", "REG_DWORD", "123"]
]
}
]
}
]
}
解决方案
这看起来很有希望。
“注册表有 2 个视图。有 32 位注册表视图和 64 位注册表视图。默认情况下,在大多数情况下,32 位应用程序只会看到 32 位注册表视图和 64 位应用程序将只能看到 64 位注册表视图。”
推荐阅读
- html - 如何删除div的一个角
- reactjs - 无法保存发布请求正文数据
- mysql - MySQL计算时间间隔x秒的行数
- excel - 如何找到最近更新的文件并将文件名更改为标准文件名?
- java - 如何将套接字连接从一个套接字通道转移到另一个?
- google-api - 使用带有原始文件名和扩展名的 Google Drive API 下载
- c# - System.Collections.Generic.List`1[System.String] 错误
- node.js - 获取 DialogSet.add():测试时添加的对话框无效
- laravel-backpack - 如何使用最新版本的背包添加简单的自定义控制器
- docusignapi - DocuSign_eSign::ApiError: 错误请求