TRegistry - 为什么一些键可读而其他键不可读?

时间:2014-08-02 09:48:42

标签: delphi delphi-xe

我写了以下代码:

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;

这似乎没有做任何事情。

我可以验证注册表路径(Windows 8.1),我甚至更改了SKey进行测试而没有任何问题,但是像这样的某些键没有返回任何内容。

我甚至尝试从Windows运行程序Administrator,但仍然没有。

还有什么我需要改变的吗?什么会使某些键可读而其他键不可用?

1 个答案:

答案 0 :(得分:11)

您的进程是32位,并且您在64位计算机上运行它。因此,您需要registry redirection

  

注册表重定向程序通过在WOW64上提供注册表某些部分的单独逻辑视图来隔离32位和64位应用程序。注册表重定向器拦截对其各自逻辑注册表视图的32位和64位注册表调用,并将它们映射到相应的物理注册表位置。重定向过程对应用程序是透明的。因此,即使数据存储在64位Windows上的其他位置,32位应用程序也可以访问注册表数据,就像它在32位Windows上运行一样。

您正在关注的关键

HKLM\SOFTWARE

被重定向。从您的32位进程,尝试打开此密钥将被重定向到注册表的32位视图,作为实现细节,存储在

HKLM\SOFTWARE\Wow6432Node

您在此处尝试执行的操作是访问注册表的64位视图。为此,您需要access an alternate registry view。这意味着在打开任何键时传递KEY_WOW64_64KEY键。

在Delphi中,您可以通过在KEY_WOW64_64KEY标志中包含Access,或者将其包含在传递给构造函数的标志中来实现。

Reg := TRegistry.Create(KEY_READ or KEY_WOW64_64KEY);

除此之外,对于此特定密钥,由于此密钥的注册表安全性配置,您需要使用管理员权限运行才能打开密钥。即使你只打算阅读它。