1

我得到了 UnknownErrorException,命名管道的错误代码为 1346,代码如下(注意:客户端和服务器在不同的机器上)

服务器代码:

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();

我从谷歌搜索了信息,发现错误是“ERROR_BAD_IMPERSONATION_LEVEL,没有提供所需的模拟级别,或者提供的模拟级别无效”

但我已经在客户端设置了 TokenImpersonationLevel.Impersonation,所以服务器应该可以访问它。有人能告诉我这是怎么回事吗?我该怎么办?

谢谢

4

1 回答 1

3

为了让服务器进程以令牌模拟级别模拟客户端Impersonate,它自己的进程标识必须具有安全权限SeImpersonatePrivilege,并且必须启用此权限。

即使客户端和服务器帐户身份是相同的域帐户也是如此。

我猜您正在测试的域帐户没有此权限,或者没有启用它。当您调用时RunAsClient,将创建一个线程令牌,但这不会被授予请求的模拟级别,因为该进程缺乏所需的特权:该级别将“降级”到Identification。然后,当进行调用时ReadAllText,在此方法的实现中的某处,Windows 安全 API 将用于根据文件的访问控制列表检查线程令牌。会发现令牌没有成功读取文件所需的模拟级别,并且会引发您看到的错误。

为了解决这个问题,您必须找到某种方法来确保您的服务器进程以具有所需权限的身份运行。

于 2013-04-17T20:34:02.807 回答