我想问一下是否有人知道如何在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)来设置权限.但是此函数返回错误'并非所有引用的权限或组都分配给调用者'
该TRegistry.LoadKey函数在内部使用该RegLoadKey函数,该函数要求调用进程具有SE_RESTORE_NAME和SE_BACKUP_NAME权限.如果对函数的调用返回值<>,则ERROR_SUCCESS (0)必须检查 LastError 和LastErrorMsg属性以获取更多信息.
检查此示例以查看必须如何调用函数以及如何处理操作的结果.
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)