C++ C+中的卷影复制+;
我正在开发一个应用程序,需要复制被锁定的文件。我打算在Windows XP+中使用卷影复制服务,但在实现过程中遇到了问题 我当前在尝试调用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
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()
}