簡體   English   中英

C ++中的卷影復制

[英]Volume Shadow Copy in C++

我正在開發一個需要復制被鎖定文件的應用程序。 我打算在Windows XP +中使用卷影復制服務,但我遇到了實現問題。

我在嘗試調用CreateVssBackupComponents()時正在獲取E_ACCESSDENIED,我認為這是因為沒有備份權限所以我正在調整進程權限令牌以包含成功的SE_BACKUP_NAME,但我仍然得到錯誤。

到目前為止我的代碼(為簡潔起見,刪除了錯誤檢查):

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>

任何人都可以幫助我或指出我正確的方向嗎? 卷影復制服務的谷歌搜索時間很少。

謝謝,J

你錯過了AdjustTokenPrivileges()所需的第4個arg,它是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()
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM