Delphi 为什么可以';打开&x27;HKLM\\SYSTEM\CurrentControlSet\Enum';从我的德尔福2010计划?
我正在尝试编写一个实用程序来自动设置PC以使用FTDI串行>USB转换器测试设备的过程。这需要查找已安装的设备信息并写入上述配置单元。我已经实现了特权提升并签署了该程序,但它不允许我打开密钥。我可以打开父项,但不能打开“Enum”键或它的子项Delphi 为什么可以';打开&x27;HKLM\\SYSTEM\CurrentControlSet\Enum';从我的德尔福2010计划?,delphi,registry,Delphi,Registry,我正在尝试编写一个实用程序来自动设置PC以使用FTDI串行>USB转换器测试设备的过程。这需要查找已安装的设备信息并写入上述配置单元。我已经实现了特权提升并签署了该程序,但它不允许我打开密钥。我可以打开父项,但不能打开“Enum”键或它的子项 procedure TForm4.Button1Click(Sender: TObject); var aReg: TRegistry; sl: TStringList; begin aReg := TRegistry.Create; tr
procedure TForm4.Button1Click(Sender: TObject);
var
aReg: TRegistry;
sl: TStringList;
begin
aReg := TRegistry.Create;
try
aReg.RootKey := HKEY_LOCAL_MACHINE;
if aReg.OpenKey('\SYSTEM\CurrentControlSet\Enum', false) then // \Enum\USB\VID_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\u ALL\u访问权限打开密钥时,提升权限将没有帮助
tregistity
在其操作中默认使用KEY\u ALL\u ACCESS
,除非您在其构造函数或ACCESS
属性中指定不同的访问权限
打开密钥读取其内容时,您可以:
- 使用重载构造函数并指定
KEY\u READ
作为所需的访问权限
- 在打开钥匙之前,使用
Access
属性设置所需的钥匙读取权限
- 使用
OpenKeyReadOnly()
而不是OpenKey()
但请注意MSDN上的注意事项:
Enum树保留供操作系统组件使用,其布局可能会更改。驱动程序和用户模式必须使用系统提供的函数(如和)从该树中提取信息。驱动程序和Windows应用程序不得直接访问枚举树。调试驱动程序时,可以使用注册表编辑器直接查看枚举树
您应该考虑使用文档中提到的替代API。
只有“Stand”默认情况下具有完全的控制访问权限。“管理员”则不然。您可以使用regedit程序查看密钥的权限。你可以读懂原因。您可以使用“OpenKeyReadOnly”读取信息,但最好使用链接中提到的api。您应该测试错误并提供它们,最好使用:TRegistry.Create(KEY_read)@弗雷德斯:最好使用OpenKeyReadOnly()
而不是OpenKey()
。在只读模式下打开密钥不满足“并写入”要求。啊,这看起来很有希望。谢谢你的帮助。