2010-10-19 104 views
4

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

当我尝试调用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> 

谁能帮助我或点我在正确的方向?在卷影复制服务上,Google的使用时间几乎没有变化。

感谢, Ĵ

回答

3

你缺少AdjustTokenPrivileges所需的4 ARG(),这是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() 
     } 
+1

感谢您的输入,好像我是不检查的错误代码来自AdjustTokenPrivileges()并错误地假定非零响应是确定的。 GetLastError()正在返回SE_BACKUP_NAME的ERROR_NOT_ALL_ASSIGNED,这似乎是问题所在。有没有在Windows 7中启用此权限而无需以管理员身份运行? – JWood 2010-10-28 09:35:25