2

(背景情報: 最後の段落までスキップしてください)

現在、別のコンピューターの O/S ドライブの完全なイメージであるハード ドライブがあります。これは外部 USB ドライブであり、書き込みブロッカーに接続され、次にコンピューターに接続されます。ファイルをコピーするためのコードをテストするために使用していますが、管理者権限だけではコピーできないファイルに遭遇しました。

Windows の権限について調べた結果、ローカル ドライブ上のすべてのファイルにアクセスするには、バックアップ権限が必要であることがわかりました。コピーのバックアップ モードを有効にする "/b" フラグを指定して robocopy を使用することで、これが必要なものであることを確認しました。すべて問題なく正常にコピーされました。自分のコードをバックアップ特権で実行できるようにする必要があるだけです。

私のコード (C#) では、必要な winapi 呼び出し (AdjustTokenPrivileges) を実装して、現在のプロセスに未検証の結果のバックアップ権限を付与しようとしました。この記事 (http://www.codeproject.com/Articles/21202/Reparse-Points-in-Vista) のコードを使用して、既知の「動作する」実装を使用しました。コード プロジェクトでは、「アクセスが拒否されました」というエラーが発生した File.Copy() を追加しようとしました。同じエラーで winapi 呼び出し CopyFileW() を使用してみました。この時点で、私はアイデアがありません:(。

参考までに(記事から)、権限昇格に使用しているコードを次に示します。

bool success;
IntPtr token;
TOKEN_PRIVILEGES tokenPrivileges = new TOKEN_PRIVILEGES();
tokenPrivileges.Privileges = new LUID_AND_ATTRIBUTES[1];
success = OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, 
                           out token);
if (success)
{
    // null for local system

    success = LookupPrivilegeValue(null, SE_BACKUP_NAME, 
                                   out tokenPrivileges.Privileges[0].Luid);
    if (success)
    {
        tokenPrivileges.PrivilegeCount = 1;
        tokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
        success = AdjustTokenPrivileges(
            token,
            false,
            ref tokenPrivileges,
            Marshal.SizeOf(tokenPrivileges),
            IntPtr.Zero,
            IntPtr.Zero);
    }
    CloseHandle(token);
}

編集:さらに情報を追加するには、プロジェクトをそのまま実行すると、リンクされた ReparsePoint コードが正常に機能します。AdjustTokenPrivilege の呼び出しを削除すると、「アクセスが拒否されました」というエラーがスローされます。

4

1 に答える 1

5

フラグを指定CreateFileして呼び出す必要があります。FILE_FLAG_BACKUP_SEMANTICSこれは、そのフラグを指定していないため、標準の Windows API を使用できないことを意味します。

于 2012-06-20T12:50:56.523 に答える