2010-10-19 4 views
4

Я разрабатываю приложение, которое нужно будет скопировать заблокированные файлы. Я намерен использовать службу теневого копирования томов в Windows XP +, но у меня возникла проблема с реализацией.Том теневой копии в C++

В настоящее время я получаю E_ACCESSDENIED при попытке позвонить CreateVssBackupComponents(), который, как я полагаю, не имеет привилегий резервного копирования, поэтому я корректирую токен привилегий процесса, чтобы включить 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 Chrome очень мало проявились в службе теневого копирования томов.

Спасибо, J

ответ

3

Вы отсутствует необходимый 4-й ARG на AdjustTokenPrivileges(), который является 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() 
     } 
+1

Спасибо за вход, кажется, я не проверял код ошибки из AdjustTokenPrivileges() и ошибочно полагал, что ненулевой ответ был в порядке. GetLastError() возвращает ERROR_NOT_ALL_ASSIGNED для SE_BACKUP_NAME, который, как представляется, является проблемой. Нужно ли разрешать эту привилегию в Windows 7 без запуска в качестве администратора? – JWood

Смежные вопросы