我写了以下代码:
var
MainForm: TMainForm;
const
SRootKey = HKEY_LOCAL_MACHINE;
SKey = 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Profiles';
implementation
{$R *.dfm}
{ TMainForm }
procedure TMainForm.GetKeys(OutList: TStrings);
var
Reg: TRegistry;
begin
OutList.BeginUpdate;
try
OutList.Clear;
Reg := TRegistry.Create(KEY_READ);
try
Reg.RootKey := SRootKey;
if (Reg.OpenKeyReadOnly(SKey)) and (Reg.HasSubKeys) then
begin
Reg.GetKeyNames(OutList);
Reg.CloseKey;
end;
finally
Reg.Free;
end;
finally
OutList.EndUpdate;
end;
end;
procedure TMainForm.btnScanClick(Sender: TObject);
begin
GetKeys(ListBox1.Items);
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
GetKeys(ListBox1.Items);
end;
Run Code Online (Sandbox Code Playgroud)
这似乎没有做任何事情.
我可以验证注册表路径(Windows 8.1),我甚至更改了SKeyfor测试而没有问题,但是像这样的某些键没有返回任何内容.
我甚至尝试从Windows运行程序Administrator,但仍然没有.
还有什么我需要改变的吗?什么会使某些键可读而其他键不可读?
Dav*_*nan 11
您的进程是32位,并且您在64位计算机上运行它.因此,您需要进行注册表重定向.
注册表重定向器通过在WOW64上提供注册表某些部分的单独逻辑视图来隔离32位和64位应用程序.注册表重定向器拦截对其各自逻辑注册表视图的32位和64位注册表调用,并将它们映射到相应的物理注册表位置.重定向过程对应用程序是透明的.因此,32位应用程序可以访问注册表数据,就像它在32位Windows上运行一样,即使数据存储在64位Windows上的其他位置也是如此.
你正在关注的关键
HKLM\SOFTWARE
Run Code Online (Sandbox Code Playgroud)
被重定向.在您的32位进程中,尝试打开此密钥将重定向到注册表的32位视图,该视图作为实现细节存储在
HKLM\SOFTWARE\Wow6432Node
Run Code Online (Sandbox Code Playgroud)
你在这里要做的是访问注册表的64位视图.为此,您需要访问备用注册表视图.这意味着KEY_WOW64_64KEY在打开任何键时传递键.
在Delphi中,您可以通过包含KEY_WOW64_64KEY在Access标志中,或通过将其包含在传递给构造函数的标志中来实现.
Reg := TRegistry.Create(KEY_READ or KEY_WOW64_64KEY);
Run Code Online (Sandbox Code Playgroud)
最重要的是,对于此特定密钥,由于此密钥的注册表安全性配置,您需要使用管理员权限运行才能打开密钥.即使你只打算阅读它.