【问题标题】:Volume Shadow Copy in C++C++ 中的卷影复制
【发布时间】:2011-04-27 17:04:32
【问题描述】:

我正在开发一个需要复制锁定文件的应用程序。我打算在 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

【问题讨论】:

    标签: c++ windows com backup volume-shadow-service


    【解决方案1】:

    您缺少 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()
            }
    

    【讨论】:

    • 感谢您的输入,看来我没有检查来自 AdjustTokenPrivileges() 的错误代码,并且错误地假设非零响应是可以的。 GetLastError() 正在为 SE_BACKUP_NAME 返回 ERROR_NOT_ALL_ASSIGNED,这似乎是问题所在。是否可以在不以管理员身份运行的情况下在 Windows 7 中启用此权限?
    猜你喜欢
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 2011-01-07
    • 2011-10-04
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 2010-11-03
    相关资源
    最近更新 更多