我正在尝试编写一个实用程序来自动设置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)
Enum默认情况下,"管理员"没有对密钥的完全访问权限.因此,当您要打开具有KEY_ALL_ACCESS访问权限的密钥时,权限的提升将无济于事.
TRegistyKEY_ALL_ACCESS除非您在其构造函数或Access属性中指定不同的访问权限,否则默认情况下会对其操作使用.
当您打开密钥以读取内容时,您可以:
使用重载的构造函数并指定KEY_READ您所需的访问权限.
在打开密钥之前,使用该Access属性设置所需的访问权限KEY_READ.
用OpenKeyReadOnly()而不是OpenKey().
但要注意MSDN上的这个说明:
HKLM\SYSTEM\CurrentControlSet\Enum注册表树
该枚举树被保留用于操作系统组件,它的布局是随时可能更改.驱动程序和用户模式设备安装组件必须使用系统提供的功能(例如IoGetDeviceProperty和SetupDiGetDeviceRegistryProperty)从此树中提取信息.驱动程序和Windows应用程序不得直接访问Enum树.调试驱动程序时,可以使用注册表编辑器直接查看枚举树.
您应该考虑使用文档中提到的替代API.
| 归档时间: |
|
| 查看次数: |
804 次 |
| 最近记录: |