Delphi 为什么可以';打开&x27;HKLM\\SYSTEM\CurrentControlSet\Enum';从我的德尔福2010计划?

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

我正在尝试编写一个实用程序来自动设置PC以使用FTDI串行>USB转换器测试设备的过程。这需要查找已安装的设备信息并写入上述配置单元。我已经实现了特权提升并签署了该程序,但它不允许我打开密钥。我可以打开父项,但不能打开“Enum”键或它的子项

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()
。在只读模式下打开密钥不满足“并写入”要求。啊,这看起来很有希望。谢谢你的帮助。