实现注册表的压缩功能,提升了权限后调用SaveKey,RestoreKey函数不成功(100分)

L

lian888

Unregistered / Unconfirmed
GUEST, unregistred user!
我想实现注册表的压缩功能,对注册表先进行保存,然后再还原时出现以下问题:
1.调用SaveKey的时候,当保存HKEY_LOCAL_MACHINE/SECURITY这个键值的时候失败,其他的都成功。
很奇怪,我已经权把限提升到debug了和system了还是不行。
2.调用RestoreKey还原的时候,都不成功。
为什么呢?请各位高手帮忙解决一下,先谢谢了:)

注册表保存调用如下:

下面这个失败
if RegistrySaveKey('/REGISTRY/MACHINE/','/SECURITY','C:/test/SECURITY.tt') then
TntMemo1.Lines.Add(' scucces')
else
TntMemo1.Lines.Add(' fail');

下面这个成功
if RegistrySaveKey('/REGISTRY/MACHINE/','/SYSTEM','C:/test/SYSTEM.tt') then
TntMemo1.Lines.Add(' scucces')
else
TntMemo1.Lines.Add(' fail');

注册表还原调用如下:

下面这个失败
if RegistryRestoreKey('/REGISTRY/MACHINE/','/SYSTEM','C:/test/SYSTEM.iobit') then
TntMemo1.Lines.Add(' scucces')
else
TntMemo1.Lines.Add(' fail');


函数如下:
function TForm1.RegistrySaveKey(const KeyRoot,KeyName,FileName: widestring): boolean;
const
ADJUST_PRIV = TOKEN_QUERY or TOKEN_ADJUST_PRIVILEGES;
SHTDWN_PRIV = 'SeBackupPrivilege';
PRIV_SIZE = sizeOf(TTokenPrivileges);
var
MyReg:TTntRegistry;
TokenPriv, Dummy: TTokenPrivileges;
Token: THandle;
Len:DWORD;
Bflag:boolean;
begin
Bflag:=false;
MyReg:=TTntRegistry.Create;
if trim(KeyRoot)='/REGISTRY/MACHINE/' then
MyReg.RootKey := HKEY_LOCAL_MACHINE;
if trim(KeyRoot)='/REGISTRY/USER/' then
MyReg.RootKey := HKEY_USERS;
DeleteFile(FileName);
OpenProcessToken(GetCurrentProcess(), ADJUST_PRIV, Token);
LookupPrivilegeValue(nil, SHTDWN_PRIV,TokenPriv.Privileges[0].Luid);
TokenPriv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;

TokenPriv.PrivilegeCount := 1; // One privilege to set
AdjustTokenPrivileges(Token, false, TokenPriv, PRIV_SIZE,Dummy, Len);
try
if MyReg.savekey(KeyName,FileName) then
Bflag:=true
else
Bflag:=false;
finally
MyReg.Free;
end;
result:=Bflag;
end;


function TForm1.RegistryRestoreKey(const KeyRoot,KeyName, FileName: widestring): boolean;
const
ADJUST_PRIV = TOKEN_QUERY or TOKEN_ADJUST_PRIVILEGES;
SHTDWN_PRIV = 'SeRestorePrivilege';
PRIV_SIZE = sizeOf(TTokenPrivileges);
var
MyReg:TTntRegistry;
TokenPriv, Dummy: TTokenPrivileges;
Token: THandle;
Len:DWORD;
Bflag:boolean;
begin
Bflag:=false;
MyReg:=TTntRegistry.Create;
if trim(KeyRoot)='/REGISTRY/MACHINE/' then
MyReg.RootKey := HKEY_LOCAL_MACHINE;
if trim(KeyRoot)='/REGISTRY/USER/' then
MyReg.RootKey := HKEY_USERS;

OpenProcessToken(GetCurrentProcess(), ADJUST_PRIV, Token);
LookupPrivilegeValue(nil, SHTDWN_PRIV,TokenPriv.Privileges[0].Luid);
TokenPriv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;

TokenPriv.PrivilegeCount := 1; // One privilege to set
AdjustTokenPrivileges(Token, false, TokenPriv, PRIV_SIZE,Dummy, Len);

try
if MyReg.RestoreKey(KeyName,FileName) then
Bflag:=true
else
Bflag:=false;
finally
MyReg.Free;
end;
result:=Bflag;
end;
 
兄弟们,帮忙看看这个问题哈
 
顶部