2010-10-19 5 views
4

Je suis en train de développer une application qui devra copier des fichiers verrouillés. J'ai l'intention d'utiliser le service Volume Shadow Copy sous Windows XP + mais je rencontre un problème avec l'implémentation.Volume Shadow Copy en C++

Je reçois actuellement E_ACCESSDENIED lorsque j'essaie d'appeler le CreateVssBackupComponents(), ce qui, je crois, est de ne pas avoir de privilèges de sauvegarde, donc j'ajuste le jeton de privilège de processus pour inclure SE_BACKUP_NAME qui réussit mais je reçois toujours l'erreur.

Mon code jusqu'à présent (vérification d'erreurs supprimé par souci de concision):

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> 

Quelqu'un peut-il me aider ou me diriger dans la bonne direction? Les heures de googling ont très peu augmenté sur le service Volume Shadow Copy.

Merci, J

Répondre

3

Vous êtes absent le 4 arg requis sur AdjustTokenPrivileges() qui est DWORD BufferLength. Voir http://msdn.microsoft.com/en-us/library/aa375202(VS.85).aspx

Plus vous devez toujours vérifier les résultats de l'API OS;)

Voici quelques exemples de code:

  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

Merci pour l'entrée, il semble que je ne vérifiait pas le code d'erreur de AdjustTokenPrivileges() et supposait à tort qu'une réponse différente de zéro était OK. GetLastError() renvoie ERROR_NOT_ALL_ASSIGNED pour SE_BACKUP_NAME, ce qui semble être le problème. Y at-il un était d'activer ce privilège dans Windows 7 sans courir en tant qu'administrateur? – JWood