1

名前付きパイプのエラー コード 1346 で UnknownErrorException を取得しました。コードは次のとおりです (注: クライアントとサーバーは別のマシンにあります)。

サーバーコード:

public static void ReadFile()
{
    string contents = File.ReadAllText(@"d:\123.txt");   <-- exception
}

public static void Main()
{    
    var pipe = new NamedPipeServerStream("testpipe", PipeDirection.InOut);
    while (true)
    {
        pipe.WaitForConnection();
        pipe.RunAsClient(ReadFile);
    }
}

クライアントコード

 NamedPipeClientStream pipeClient =
                new NamedPipeClientStream("\\jachang-w1", "testpipe",
                    PipeDirection.InOut, PipeOptions.None,
                    TokenImpersonationLevel.Impersonation);
 pipeClient.Connect();

Google から情報を検索したところ、「ERROR_BAD_IMPERSONATION_LEVEL、必要な偽装レベルが提供されていないか、提供された偽装レベルが無効です」というエラーが見つかりました。

しかし、クライアントで TokenImpersonationLevel.Impersonation を設定したので、サーバーはそれにアクセスできるはずです。誰かが私に何が悪いのか教えてもらえますか? どうすればいいですか?

ありがとう

4

1 に答える 1

3

サーバー プロセスがトークン偽装レベルでクライアントを偽装するにはImpersonate、そのプロセス ID にセキュリティ特権がSeImpersonatePrivilege必要であり、この特権が有効になっている必要があります。

これは、クライアント アカウントとサーバー アカウントの ID が同じドメイン アカウントであっても当てはまります。

テストしているドメイン アカウントにはこの権限がないか、有効になっていないと思います。を呼び出すRunAsClientと、スレッド トークンが作成されますが、プロセスに必要な権限がないため、要求された偽装レベルは付与されません。レベルは に「ダウングレード」されIdentificationます。次に、 への呼び出しReadAllTextが行われると、このメソッドの実装内のどこかで Windows セキュリティ API が使用され、ファイルのアクセス制御リストに対してスレッド トークンがチェックされます。トークンは、ファイルの読み取りに成功するために必要な偽装レベルを持っていないことがわかり、見たエラーが発生します。

この問題を解決するには、必要な特権を持つ ID でサーバー プロセスが実行されるようにする何らかの方法を見つける必要があります。

于 2013-04-17T20:34:02.807 に答える