草庐IT

为只读命名管道(NamedPipeClientStream 类)启用 MessageMode 时出现 C# UnauthorizedAccessException

coder 2024-05-25 原文

.NET 中的 NamedPipeClientStream 类存在问题,您无法使用 PipeDirection.In 创建此类的实例,然后成功更改 ReadModePipeTransmissionMode.Message

尝试这样做会引发 UnauthorizedAccessException。虽然管道通常用于进程之间的通信,但单个进程中的这个简单示例说明了问题:

var pipeOut = new NamedPipeServerStream("SomeNamedPipe", 
                                        PipeDirection.Out, 
                                        1, 
                                        PipeTransmissionMode.Message);
var pipeIn = new NamedPipeClientStream(".", 
                                       "SomeNamedPipe", 
                                       PipeDirection.In);
pipeIn.Connect();
pipeIn.ReadMode = PipeTransmissionMode.Message;

尝试设置 ReadMode 属性时,此代码将抛出 UnauthorizedAccessException


在搜索关于这个问题的信息时,我在其他地方找到了对它的引用,比如这里:

所有这些帖子都提到这是“奇怪的”、“奇怪的”等,但没有解释“为什么”它不起作用,并且都给出了相同的解决方法,即“出于某种奇怪的原因”设置InOut 的管道方向使其工作。

的确,这确实使它起作用,但它需要从根本上改变管道的定义,在两端,全双工而不是单向,我认为这是一种非常糟糕的方法,除非您可以更改客户端和服务器,这甚至是不可能的。


我的问题是,为什么在入站管道上启用消息模式会导致异常,是否有比将管道更改为双向模式更好的方法来解决此问题?

最佳答案

查看 Microsoft 引用源,我可以看到设置 ReadMode 属性只是调用 win32 SetNamedPipeHandleState 函数来执行操作,此调用引发的错误如下异常(exception)。根据文档 SetNamedPipeHandleState function它说明了管道句柄,以便调用此函数

the handle must have GENERIC_WRITE access to the named pipe for a write-only or read/write pipe, or it must have GENERIC_READ and FILE_WRITE_ATTRIBUTES access for a read-only pipe.

问题就出在这里。

如果我们查看采用 PipeDirection 设置的 NamedPipeClientStream 的构造函数,我们会发现它们只请求 GENERIC_READ 访问 PipeDirection.InGENERIC_WRITEPipeDirection.Out 的访问(或对 InOut 的两者)。这意味着在 OutInOut 模式下打开的任何管道都可以工作,因为 GENERIC_WRITE 访问权限对于这些情况就足够了,但我们需要两者 GENERIC_READFILE_WRITE_ATTRIBUTES 用于只读管道,NamedPipeClientStream 类从不请求。这是类中的缺陷,应由 Microsoft 更正。

我已在此处提交有关 Microsoft Connect 的错误报告:

https://connect.microsoft.com/VisualStudio/feedback/details/1825187

如果您自己遇到这个问题,请给它投票,它可能有助于加快修复速度。


在修复之前(截至 3/2017 没有修复),可以通过为 NamedPipeClientStream 使用不同的构造函数来完全解决此问题。

构造函数有一个重载,而不是 PipeDirection 枚举,而是 PipeAccessRights 枚举,您可以在其中指定所需的访问权限的特定组合获取句柄。然后,构造函数从指定访问权限的组合中得出管道的方向(如果指定了 ReadData,则为 In;如果 ,则为 Out) WriteData 被指定,InOut 如果它们都被指定)。

这意味着,你可以解决这个问题,而不必让你的管道全双工,只需像这样更改构造函数行:

var pipeIn = new NamedPipeClientStream("<ServerName>", "<PipeName>", PipeDirection.In);

为此:

var pipeIn = 
   new NamedPipeClientStream("<ServerName>", 
                             "<PipeName>", 
                             PipeAccessRights.ReadData | PipeAccessRights.WriteAttributes, 
                             PipeOptions.None, 
                             System.Security.Principal.TokenImpersonationLevel.None, 
                             System.IO.HandleInheritability.None);

如果您使用此备用构造函数作为建议的解决方法,结果将与您从构造函数的第一种形式获得的结果相同且无法区分,但将获得此附加访问权限,因此该消息可以启用模式。

关于为只读命名管道(NamedPipeClientStream 类)启用 MessageMode 时出现 C# UnauthorizedAccessException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32739224/

有关为只读命名管道(NamedPipeClientStream 类)启用 MessageMode 时出现 C# UnauthorizedAccessException的更多相关文章

  1. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

  2. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

  3. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

  4. ruby-on-rails - 如何重命名或移动 Rails 的 README_FOR_APP - 2

    当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?

  5. ruby - rails 3 redirect_to 将参数传递给命名路由 - 2

    我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use

  6. ruby-on-rails - 启用 Rack::Deflater 时 ETag 发生变化 - 2

    在启用Rack::Deflater来gzip我的响应主体时偶然发现了一些奇怪的东西。也许我遗漏了一些东西,但启用此功能后,响应被压缩,但是资源的ETag在每个请求上都会发生变化。这会强制应用程序每次都响应,而不是发送304。这在没有启用Rack::Deflater的情况下有效,我已经验证页面源没有改变。我正在运行一个使用thin作为Web服务器的Rails应用程序。Gemfile.lockhttps://gist.github.com/2510816有没有什么方法可以让我从Rack中间件获得更多的输出,这样我就可以看到发生了什么?提前致谢。 最佳答案

  7. ruby-on-rails - 从应用程序中自定义文件夹内的命名空间自动加载 - 2

    我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty

  8. ruby - 使用 postgres.app 在 rvm 下要求 pg 时出错 - 2

    我正在使用Postgres.app在OSX(10.8.3)上。我已经修改了我的PATH,以便应用程序的bin文件夹位于所有其他文件夹之前。Rammy:~phrogz$whichpg_config/Applications/Postgres.app/Contents/MacOS/bin/pg_config我已经安装了rvm并且可以毫无错误地安装pggem,但是当我需要它时我得到一个错误:Rammy:~phrogz$gem-v1.8.25Rammy:~phrogz$geminstallpgFetching:pg-0.15.1.gem(100%)Buildingnativeextension

  9. ruby-on-rails - 为什么在安装 Ruby 1.9.3 时出现 404 错误? - 2

    我最近对我的计算机(OS-MacOSX10.6.8)进行了删除,并且我正在重新安装我所有的开发工具。我再次安装了RVM;但是,它不会让我安装Ruby1.9.3。到目前为止我已经尝试过:rvminstall1.9.3rvm安装1.9.3-p194rvm安装1.9.3-p448rvminstall1.9.3--with-gcc=clang所有返回相同的命令行错误:Searchingforbinaryrubies,thismighttakesometime.Nobinaryrubiesavailablefor:osx/10.6/x86_64/ruby-1.9.3-p448.Continuin

  10. ruby-on-rails - Rails - 从命名路由中提取 HTTP 动词 - 2

    Rails中有没有一种方法可以提取与路由关联的HTTP动词?例如,给定这样的路线:将“users”匹配到:“users#show”,通过:[:get,:post]我能实现这样的目标吗?users_path.respond_to?(:get)(显然#respond_to不是正确的方法)我最接近的是通过执行以下操作,但它似乎并不令人满意。Rails.application.routes.routes.named_routes["users"].constraints[:request_method]#=>/^GET$/对于上下文,我有一个设置cookie然后执行redirect_to:ba

随机推荐