我想问一下是否有人知道如何将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)来设置权限。但是此函数返回错误'并非所有引用的权限或组都分配给调用者'
答案 0 :(得分:5)
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;
答案 1 :(得分:0)
加载和操作特定用户的注册表配置单元的正确方法是让您的调用线程模拟该用户(如果该线程尚未以该用户身份运行),然后使用{{3}
,},RegOpenCurrentUser()
和/或RegOpenUserClassesRoot()
。