【问题标题】:NamedPipeServerStream Unauthorized Access exceptionNamedPipeServerStream 未授权访问异常
【发布时间】:2021-03-20 21:34:53
【问题描述】:

我从我的一位用户那里收到了一个 Event Viever 条目,说发生了未经授权的访问异常。该过程从作为 SYSTEM 的服务启动。我能够将错误缩小到创建 NamedPipeServerStream 的部分:

  // <error in this block>
  PipeSecurity pipeSa = new PipeSecurity(); 
  pipeSa.AddAccessRule(new PipeAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null), PipeAccessRights.ReadWrite, AccessControlType.Allow));
  NamedPipeServerStream np = new NamedPipeServerStream("streamname", PipeDirection.InOut,1,PipeTransmissionMode.Message,PipeOptions.None,16383,1, pipeSa);
  // </error in this block>


  while (true){
     try{
        if (!np.IsConnected)
           np.WaitForConnection();
     }catch(Exception e){

     }
  }

我很确定错误出现在上面的 3 行块中。它不会发生在我的任何计算机上,所以我不能重复错误。上述代码中的哪些内容不被视为最佳实践并且可能导致错误?

错误信息图片:

【问题讨论】:

  • 看看我的回答让我知道它是否适合你
  • @johnny5 谢谢!更新发布后会报告

标签: c# namedpipeserverstream


【解决方案1】:

你问的问题很少有细节。因此,很难确定真正的原因是什么。不过我愿意试一试。

如果您查看Unauthorized Access Exception 的文档

当操作系统因 I/O 错误或特定类型的安全错误而拒绝访问时引发的异常。

我们可以看到您的代码已经吞噬了所有异常。所以我们可以假设这是在创建管道时抛出的。

我最好的猜测是,有时您无法访问管道,因为系统没有正确访问管道。在做了一些快速研究之后。这个question 似乎有很多值得一试的好信息。套用几个答案:

有两件事会导致第二个或后续的实例化 NamedPipeServerStream 在同一管道上失败:

  • 创建管道服务器的第一个实例时,maxNumberOfServerInstances ctor 参数必须设置为大于 1。否则,除非第一个实例已完全关闭,否则第二个调用将失败。
  • 调用ctor 的进程必须具有由PipeAccessRights.CreateNewInstance 表示的访问权限。这是管道服务器应该警惕的强大权利,因为它允许其拥有者充当管道服务器的能力。

您可能缺少需要添加访问权限的权限,也许您需要为系统提供控制:

pipeSa.AddAccessRule(new PipeAccessRule("SYSTEM", PipeAccessRights.FullControl, AccessControlType.Allow));
pipeSa.AddAccessRule(pa);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    • 2016-05-11
    • 1970-01-01
    相关资源
    最近更新 更多