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

Koo*_*t33 2 delphi registry

我正在尝试编写一个实用程序来自动设置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;
Run Code Online (Sandbox Code Playgroud)

Ser*_*yuz 7

Enum默认情况下,"管理员"没有对密钥的完全访问权限.因此,当您要打开具有KEY_ALL_ACCESS访问权限的密钥时,权限的提升将无济于事.

TRegistyKEY_ALL_ACCESS除非您在其构造函数或Access属性中指定不同的访问权限,否则默认情况下会对其操作使用.

当您打开密钥以读取内容时,您可以:

  • 使用重载的构造函数并指定KEY_READ您所需的访问权限.

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

  • OpenKeyReadOnly()而不是OpenKey().

但要注意MSDN上的这个说明:

HKLM\SYSTEM\CurrentControlSet\Enum注册表树

枚举树被保留用于操作系统组件,它的布局是随时可能更改.驱动程序和用户模式设备安装组件必须使用系统提供的功能(例如IoGetDevicePropertySetupDiGetDeviceRegistryProperty)从此树中提取信息.驱动程序和Windows应用程序不得直接访问Enum.调试驱动程序时,可以使用注册表编辑器直接查看枚举树.

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