Делаю так:
Код | //функция установки приоритета HRESULT ModifyPrivilege( IN LPCTSTR szPrivilege, IN BOOL fEnable) { HRESULT hr = S_OK; TOKEN_PRIVILEGES NewState; LUID luid; HANDLE hToken = NULL;
// Open the process token for this process. if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken )) { MessageDlg("Failed OpenProcessToken",mtError, TMsgDlgButtons() << mbOK, 0); return ERROR_FUNCTION_FAILED; }
// Get the local unique ID for the privilege. if ( !LookupPrivilegeValue( NULL, szPrivilege, &luid )) { CloseHandle( hToken ); MessageDlg("Failed LookupPrivilegeValue",mtError, TMsgDlgButtons() << mbOK, 0); return ERROR_FUNCTION_FAILED; }
// Assign values to the TOKEN_PRIVILEGE structure. NewState.PrivilegeCount = 1; NewState.Privileges[0].Luid = luid; NewState.Privileges[0].Attributes = (fEnable ? SE_PRIVILEGE_ENABLED : 0);
// Adjust the token privilege. if (!AdjustTokenPrivileges(hToken, FALSE, &NewState, 0, NULL, NULL)) { MessageDlg("Failed AdjustTokenPrivileges",mtError, TMsgDlgButtons() << mbOK, 0); hr = ERROR_FUNCTION_FAILED; }
// Close the handle. CloseHandle(hToken);
return hr; }
|
Главная функция:
Код | ... if (RegOpenKey(HKEY_LOCAL_MACHINE,............,&hk)==ERROR_SUCCESS) { HRESULT hr; hr = ModifyPrivilege(SE_BACKUP_NAME, TRUE); if (!SUCCEEDED(hr)) MessageDlg("Failed to modify privilege.",mtError, TMsgDlgButtons() << mbOK, 0); else MessageDlg("Successfully modified privilege",mtError, TMsgDlgButtons() << mbOK, 0);
if (RegSaveKeyEx(hk,"REGNAME.reg",NULL,REG_STANDARD_FORMAT)==ERROR_SUCCESS) RegCloseKey(hk); } ...
|
Проблема в том, что функция RegSaveKeyEx создает файл нулевой длины, и не возвращает ERROR_SUCCESS, хоть у установлен приоритет SE_BACKUP_NAME. ОС: Windows XP |