为什么我无法从我的 Delphi 2010 程序中打开 'HKLM\\SYSTEM\CurrentControlSet\Enum'?



我正在尝试编写一个实用程序来自动化设置 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。

相关内容

最新更新