我正在开发一个应用程序,将需要复制被locking的文件。 我打算在Windows XP +中使用卷影复制服务,但是我遇到了实现问题。
我正在尝试调用CreateVssBackupComponents()
,我相信是没有备份权限,所以我正在调整进程权限令牌包括SE_BACKUP_NAME成功,但我仍然得到错误,目前正在E_ACCESSDENIED。
我的代码到目前为止(错误检查删除简洁):
CoInitialize(NULL); OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken); LookupPrivilegeValue(NULL, SE_BACKUP_NAME, &luid); NewState.PrivilegeCount = 1; NewState.Privileges[0].Luid = luid; NewState.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken, FALSE, &NewState, 0, NULL, NULL); IVssBackupComponents *pBackup = NULL; HRESULT result = CreateVssBackupComponents(&pBackup); // result == E_ACCESSDENIED at this point pBackup->InitializeForBackup(); <snip>
任何人都可以帮助我或正确的方向指向我吗? 使用卷影复制服务的时间在Google上几乎没有变化。
谢谢,J
你错过了AdjustTokenPrivileges()这个DWORD BufferLength所需的第四个参数。 请参阅http://msdn.microsoft.com/en-us/library/aa375202(VS.85).aspx
另外你需要经常检查你的OS API结果;)
这里是一些示例代码:
TOKEN_PRIVILEGES tp; TOKEN_PRIVILEGES oldtp; DWORD dwSize = sizeof (TOKEN_PRIVILEGES); ZeroMemory (&tp, sizeof (tp)); tp.PrivilegeCount = 1; tp.Privileges[0].Luid = luid; tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; if (AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), &oldtp, &dwSize)) { DWORD lastError = GetLastError(); switch (lastError) { case ERROR_SUCCESS: // success break; case ERROR_NOT_ALL_ASSIGNED: // fail break; default: // unexpected value!! } } else { // failed! check GetLastError() }