C#:命名管道的完整性较低

本文关键字:完整性 管道 | 更新日期: 2023-09-27 18:00:33

我正在C#中开发一个Internet Explorer浏览器帮助程序对象(BHO)。此BHO检测用户导航到的URL,然后自动填充用户名和密码。

BHO与作为服务运行的进程进行通信。通信通过命名管道进行。

当保护模式关闭时,通信工作正常。但当保护模式打开时,通信不工作。如果我以管理员身份运行iexplore.exe,那么它就可以工作了。

在保护模式下,我收到拒绝访问的消息。

读过这篇文章后,我意识到管道访问被拒绝,因为IE正在低完整性范围。

我看完了下面的文章a.理解并在保护模式下工作Internet Explorerhttp://msdn.microsoft.com/en-us/library/bb250462.aspx

b.还讨论了在创建管道资源之前设置安全信息的许多建议,以允许较低完整性的进程使用此信息。然而,这些对我来说用处不大。我仍然会犯同样的错误。

我目前唯一的工作就是通过套接字进行通信。我验证了这种方法的有效性。

我更喜欢使用命名管道方法。

以下是我在打开管道之前设置安全上下文的源代码

服务侧代码:

PipeSecurity security = new PipeSecurity();
security.AddAccessRule(new PipeAccessRule(
new SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, null),  // @"Users"
            PipeAccessRights.ReadWrite, 
            System.Security.AccessControl.AccessControlType.Allow
            ));
var currentUser = WindowsIdentity.GetCurrent().Name;
security.AddAccessRule(new PipeAccessRule(currentUser, PipeAccessRights.FullControl,   System.Security.AccessControl.AccessControlType.Allow));

NamedPipeServerStream stream;
stream = new NamedPipeServerStream(
            CommandPipeName,
            PipeDirection.InOut, MAX_PIPE_INSTANCE,
            PipeTransmissionMode.Message, PipeOptions.WriteThrough,
            EPHelperCommandPipeServerConsts.MaxPipeRequestLength,
            EPHelperCommandPipeServerConsts.MaxPipeResponseLength,
            security
            );
do
        {
            n++;
            isListening = true;
            stream.WaitForConnection();
            isListening = false;
            var cs = stream;
            stream = new NamedPipeServerStream(
                    CommandPipeName,
                    PipeDirection.InOut, MAX_PIPE_INSTANCE,
                    PipeTransmissionMode.Message, PipeOptions.WriteThrough,
                    EPHelperCommandPipeServerConsts.MaxPipeRequestLength,
                    EPHelperCommandPipeServerConsts.MaxPipeResponseLength,
                    security
                    );
    // some code
        } while (true);

有什么东西我遗漏了吗?

谢谢。

C#:命名管道的完整性较低

我猜您违反了Vista中添加到Windows的完整性级别机制。该机制与基于访问控制列表中的允许和拒绝条目的访问控制机制正交。

在我看来,降低管道完整性级别的想法是正确的方法,但您的代码根本无法做到这一点。.NET Framework类中还不支持对与资源关联的完整性标签进行更改。您必须使用Win32 API。

请参阅我的博客,了解我如何解决类似问题(备选url):它可能会给你一些指针