4

我正在开发一个需要复制被锁定文件的应用程序。我打算在 Windows XP+ 中使用卷影复制服务,但我遇到了实施问题。

我目前在尝试调用时收到 E_ACCESSDENIED CreateVssBackupComponents(),我认为这是因为没有备份权限,所以我正在调整进程权限令牌以包含 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

4

1 回答 1

3

您缺少 AdjustTokenPrivileges() 上所需的第 4 个参数,即 DWORD BufferLength。请参阅http://msdn.microsoft.com/en-us/library/aa375202(VS.85).aspx

另外,您需要始终检查您的操作系统 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()
        }
于 2010-10-24T22:50:34.007 回答