关于用RegSaveKey导出注册表的问题(80分)

  • 主题发起人 主题发起人 autofish
  • 开始时间 开始时间
A

autofish

Unregistered / Unconfirmed
GUEST, unregistred user!
我用这个函数导出注册表的某个分支,但没有成功。<br>返回值是1314(就是客户没有所需的特权)。<br>为什么呢?我进行其他读写操作都没有问题。<br>操作系统:win2000 professional 帐号:administrator。<br>
 
看看这里有详细的例子。<br>http://home.ural.ru/~delphi3/delp/com/reg/rgcomdet.htm
 
问题还是没有解决。应该说RegSaveKey(Key,FileName,nil)的调用是没有问题的,只要安全<br>属性参数传进nil,就会创建默认的安全属性的。
 
在WinNT(2000、XP)要使用API RegSaveKey來Dump, 則行程必需要有SeBackupPrivilege的<br>Privilege,即使是用Administrator登入, 預設還是不會有此權限, 必需在程式中透過API來<br>調整, 相關的API有 OpenProcessToken、LookupPrivilegeValue、AdjustTokenPrivileges<br>等<br>procedure SetProcessTokenPrivileges(Enabled: boolean; const PrivilegeArray: array of string);<br>&nbsp; var<br>&nbsp; &nbsp; I: integer;<br>&nbsp; &nbsp; Token: THandle;<br>&nbsp; &nbsp; Privileges: PTokenPrivileges;<br>begin<br>&nbsp; if Win32Platform = VER_PLATFORM_WIN32_NT then begin<br>&nbsp; &nbsp; GetMem(Privileges, SizeOf(DWord)+SizeOf(TLUIDAndAttributes) * (High(PrivilegeArray)+1));<br>&nbsp; &nbsp; try<br>&nbsp; &nbsp; &nbsp; with Privileges^ do begin<br>&nbsp; &nbsp; &nbsp; &nbsp; PrivilegeCount := High(PrivilegeArray);<br>&nbsp; &nbsp; &nbsp; &nbsp; for I := 0 to PrivilegeCount do begin<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if not LookupPrivilegeValue(nil, PChar(PrivilegeArray), Privileges.Luid) then RaiseLastWin32Error;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Privileges.Attributes := SE_PRIVILEGE_ENABLED;<br>&nbsp; &nbsp; &nbsp; &nbsp; end;<br>&nbsp; &nbsp; &nbsp; &nbsp; Inc(PrivilegeCount);<br>&nbsp; &nbsp; &nbsp; end;<br>&nbsp; &nbsp; &nbsp; if not OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, Token) then<br>&nbsp; &nbsp; &nbsp; &nbsp; RaiseLastWin32Error;<br>&nbsp; &nbsp; &nbsp; try<br>&nbsp; &nbsp; &nbsp; &nbsp; AdjustTokenPrivileges(Token, not Enabled, Privileges, 0, nil, nil);<br>&nbsp; &nbsp; &nbsp; finally<br>&nbsp; &nbsp; &nbsp; &nbsp; CloseHandle(Token);<br>&nbsp; &nbsp; &nbsp; end;<br>&nbsp; &nbsp; finally<br>&nbsp; &nbsp; &nbsp; FreeMem(Privileges);<br>&nbsp; &nbsp; end;<br>&nbsp; end;<br><br>在RegSaveKey前, 可以呼叫SetProcessTokenPrivileges(True, ['SeBackupPrivilege']);<br>如果要將Dump出來的資料Restore回Registry中, 則在Restore前要設定SeRestorePrivilege<br><br><br>
 
后退
顶部