C++ C+中的卷影复制+;

C++ C+中的卷影复制+;,c++,windows,com,backup,volume-shadow-service,C++,Windows,Com,Backup,Volume Shadow Service,我正在开发一个应用程序,需要复制被锁定的文件。我打算在Windows XP+中使用卷影复制服务,但在实现过程中遇到了问题 我当前在尝试调用CreateVssBackupComponents()时被拒绝访问E_,我认为这是由于没有备份权限,因此我正在调整进程权限令牌,以包括成功的SE_backup_名称,但我仍然收到错误 到目前为止我的代码(为简洁起见已删除错误检查): CoInitialize(空); OpenProcessToken(GetCurrentProcess()、TOKEN_ADJU

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

我当前在尝试调用
CreateVssBackupComponents()
时被拒绝访问E_,我认为这是由于没有备份权限,因此我正在调整进程权限令牌,以包括成功的SE_backup_名称,但我仍然收到错误

到目前为止我的代码(为简洁起见已删除错误检查):

CoInitialize(空);
OpenProcessToken(GetCurrentProcess()、TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken);
LookupPrivilegeValue(NULL、SE\u BACKUP\u NAME和luid);
NewState.privilegecont=1;
NewState.Privileges[0]。Luid=Luid;
NewState.Privileges[0]。属性=SE_PRIVILEGE_已启用;
AdjustTokenPrivileges(hToken、FALSE和NewState、0、NULL、NULL);
IVssBackupComponents*pBackup=NULL;
HRESULT结果=CreateVssBackupComponents(&pBackup);
//结果==此时拒绝E_访问
pBackup->InitializeForBackup();
有人能帮我解决问题或给我指出正确的方向吗?数小时的谷歌搜索在卷影复制服务上几乎没有发现

谢谢,
J

您缺少AdjustTokenPrivileges()上所需的第四个参数,即DWORD BufferLength。 看

另外,您需要始终检查操作系统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\U备份\u名称分配的错误\u NOT\u ALL\u,这可能是问题所在。是否存在在Windows 7中启用此权限而不以管理员身份运行的权限?
            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()
        }