Volume Shadow Copy в C ++ - PullRequest
       30

Volume Shadow Copy в C ++

4 голосов
/ 20 октября 2010

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

В настоящее время я получаю 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 Volume Shadow Copy оказалось очень мало.

Спасибо, J

1 Ответ

3 голосов
/ 25 октября 2010

Вам не хватает необходимого 4-го аргумента в 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()
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...