我正在尝试编写一个实用程序来自动化设置 PC 以使用 FTDI 串行>USB 转换器测试设备的过程。这需要查找已安装的设备信息并写入上述配置单元。我已经实现了特权提升并签署了程序,但它不允许我打开密钥。我可以打开父项,但不能打开"枚举"键或其子项。
procedure TForm4.Button1Click(Sender: TObject);
var
aReg: TRegistry;
sl: TStringList;
begin
aReg := TRegistry.Create;
try
aReg.RootKey := HKEY_LOCAL_MACHINE;
if aReg.OpenKey('SYSTEMCurrentControlSetEnum', false) then // EnumUSBVID_0403&PID_6001', false) then
begin
sl := TStringList.Create;
try
aReg.GetKeyNames(sl);
Memo1.Lines.Assign(sl);
Memo1.Lines.Add(IntToStr(sl.Count) + ' keys found.');
finally
sl.Free;
end;
end else
Memo1.Lines.Add('Could not open key');
finally
aReg.Free;
end;
end;
默认情况下,"管理员"没有对Enum
密钥的完全访问权限。因此,当您想要以KEY_ALL_ACCESS
访问权限打开密钥时,特权提升将无济于事。
默认情况下,TRegisty
在其操作上使用KEY_ALL_ACCESS
,除非您在其构造函数或Access
属性中指定了不同的访问权限。
打开密钥以读取其内容时,可以:
使用重载构造函数并将
KEY_READ
指定为所需的访问权限。在打开密钥之前,使用
Access
属性设置对KEY_READ
的所需访问权限。使用
OpenKeyReadOnly()
而不是OpenKey()
。
但请注意 MSDN 上的此说明:
HKLM\SYSTEM\CurrentControlSet\Enum Registry Tree
枚举树保留供操作系统组件使用,其布局可能会发生变化。驱动程序和用户模式设备安装组件必须使用系统提供的函数(如 IoGetDeviceProperty 和 SetupDiGetDeviceRegistryProperty)从此树中提取信息。驱动程序和 Windows 应用程序不得直接访问枚举树。调试驱动程序时,可以使用注册表编辑器直接查看枚举树。
应考虑使用文档中提到的替代 API。