用delphi加载ntuser.dat hive

who*_*saa 1 delphi registry

我想问一下是否有人知道如何在Windows7或XP上将ntuser.dat文件加载到注册表中的正确方法.我一直试图通过使用此代码来实现这一目标

_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; 
Run Code Online (Sandbox Code Playgroud)

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

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

RRU*_*RUZ 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;
Run Code Online (Sandbox Code Playgroud)