用delphi加载ntuser.dat hive

时间:2012-01-02 22:29:45

标签: delphi registry

我想问一下是否有人知道如何将ntuser.dat文件加载到Windows7或XP上的注册表中。我一直试图通过使用此代码

来实现这一目标
_Reg := TRegistry.Create;
_Reg.RootKey := HKEY_USERS;
if (_Reg.Loadkey('Test2', 'C:\Users\Test2\NTUSER.DAT')) then
  ShowMessage('User hive loaded'); 
_Reg.Unloadkey('Test2');
_Reg.CloseKey;
_Reg.Free; 

文件路径正确且文件存在。我还尝试使用我在互联网EnableNTPrivilege('SeRestorePrivilege', SE_PRIVILEGE_ENABLED)上找到的功能来设置权限,然后再尝试加载配置单元。而且我仍然从_Reg.Loadkey得到了错误。

我也尝试使用此功能NTSetPrivilege('SeRestorePrivilege', True)来设置权限。但是此函数返回错误'并非所有引用的权限或组都分配给调用者'

2 个答案:

答案 0 :(得分:5)

TRegistry.LoadKey函数在内部使用RegLoadKey函数,该函数要求调用进程具有SE_RESTORE_NAME和SE_BACKUP_NAME权限。如果对函数的调用返回值<>要ERROR_SUCCESS (0),请检查LastErrorLastErrorMsg属性以获取更多信息。

检查此示例以查看必须如何调用函数以及如何处理操作的结果。

var
 Reg : TRegistry;
begin
  Reg := TRegistry.Create;
  try
    NTSetPrivilege('SeRestorePrivilege', True); //this is a third-party function, you can implemnt your own to set the privileges.
    NTSetPrivilege('SeBackupPrivilege', True);
    Reg.RootKey := HKEY_USERS;
    if (Reg.Loadkey('Test2', 'C:\Users\Test2\NTUSER.DAT')) then
    begin
      try
        Reg.OpenKey('Test2', False);
        try
            //do your stuff here


        finally
          Reg.CloseKey;
        end;
      finally
       Reg.Unloadkey('Test2');
      end;
    end
    else
      Writeln(Reg.LastErrorMsg);
  finally
    Reg.Free;
  end;
end;

答案 1 :(得分:0)

加载和操作特定用户的注册表配置单元的正确方法是让您的调用线程模拟该用户(如果该线程尚未以该用户身份运行),然后使用{{3}

,},RegOpenCurrentUser()和/或RegOpenUserClassesRoot()