4

ロックされたファイルをコピーする必要があるアプリケーションを開発しています。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>

誰かが私を助けたり、正しい方向に向けたりできますか? ボリューム シャドウ コピー サービスでは、グーグルで検索した時間はほとんどありません。

ありがとう、J

4

1 に答える 1

3

DWORD BufferLength である AdjustTokenPrivileges() に必要な 4 番目の引数がありません。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()
        }
于 2010-10-24T22:50:34.007 に答える