【问题标题】:Why can't I open 'HKLM\\SYSTEM\CurrentControlSet\Enum' from my Delphi 2010 program?为什么我不能从我的 Delphi 2010 程序中打开 'HKLM\\SYSTEM\CurrentControlSet\Enum'?
【发布时间】:2016-06-17 22:49:41
【问题描述】:

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

【问题讨论】:

  • 默认情况下只有“system”拥有完全控制权限。 “管理员”并非如此。您可以使用 regedit 程序查看密钥的权限。您可以阅读原因here。您可以使用'OpenKeyReadOnly'来读取信息,但您最好使用链接中提到的api。
  • 你应该测试错误并提供它们,最好的猜测,使用:TRegistry.Create(KEY_READ);
  • @FredS:最好使用OpenKeyReadOnly() 而不是OpenKey()
  • 以只读模式打开密钥不满足“和写入”要求。

标签: delphi registry


【解决方案1】:

默认情况下,“管理员”没有对 Enum 键的完全访问权限。因此,当您想以KEY_ALL_ACCESS 访问权限打开密钥时,提升权限将无济于事。

TRegisty 在其操作中默认使用KEY_ALL_ACCESS,除非您在其构造函数或Access 属性中指定不同的访问权限。

当您打开钥匙阅读内容时,您可以:

  • 使用重载的构造函数并指定KEY_READ 作为您想要的访问权限。

  • 在打开密钥之前,使用Access 属性设置对KEY_READ 的所需访问权限。

  • 使用OpenKeyReadOnly() 而不是OpenKey()

但请注意 MSDN 上的此注释:

HKLM\SYSTEM\CurrentControlSet\Enum Registry Tree

Enum树保留供操作系统组件使用,其布局可能会发生变化。驱动程序和用户模式Device Installation Components 必须使用系统提供的函数,例如IoGetDevicePropertySetupDiGetDeviceRegistryProperty,从该树中提取信息。 驱动程序和 Windows 应用程序不得直接访问 Enum。您可以在调试驱动程序时使用注册表编辑器直接查看枚举树。

您应该考虑使用文档中提到的替代 API。

【讨论】:

  • 啊,这看起来很有希望。感谢您的帮助。
猜你喜欢
  • 2015-02-27
  • 1970-01-01
  • 1970-01-01
  • 2013-10-20
  • 2014-04-25
  • 2010-10-08
  • 1970-01-01
  • 2021-12-29
  • 2012-08-08
相关资源
最近更新 更多