我正在开发一个需要复制被锁定文件的应用程序。我打算在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>
任何人都可以帮助我或指出我正确的方向吗?卷影复制服务的谷歌搜索时间很少。
谢谢, Ĵ
答案 0 :(得分:3)
您在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()
}