【问题标题】:How can I tell if the server side of a named pipe is an admin?如何判断命名管道的服务器端是否是管理员?
【发布时间】:2012-10-10 10:21:03
【问题描述】:

我正在尝试在 Windows XP SP2+ 上使用命名管道。管道服务器将是一项服务,以某种管理员/系统级帐户的身份运行。管道客户端可以是任何用户,可能是访客,也可能是管理员。就我而言,我可以让访客帐户成功地与以管理员身份运行的服务通信。

在我开始在我的客户端代码中使用管道之前,我想验证管道的另一端是否真正归管理员/系统所有。

我发现了 GetSecurityInfo 函数,我认为我应该能够将它用作解决方案的一部分。但是,我不知道如何从 SID 获得“是管理员”检查。

【问题讨论】:

    标签: windows security named-pipes


    【解决方案1】:

    由管理帐户(包括系统帐户)创建的所有对象的默认所有者是众所周知的管理员组,您不能将您创建的对象的所有权分配给没有管理权限的其他人。

    所以你可以检查如下:

    确保在您打开管道时(使用CreateFile)传递 SECURITY_IDENTIFICATION 标志以确保潜在的恶意服务器无法冒充您。

    【讨论】:

    • 这句话听起来很有用,你知道有什么地方记载它吗? “由管理帐户(包括系统帐户)创建的所有对象的默认所有者是众所周知的管理员组”另外,感谢模拟提示。
    • 我只能找到这篇相当老的文章,support.microsoft.com/kb/126629;但是,如果您担心,您始终可以使用 SetSecurityInfo 将管理员组明确指定为所有者。
    • 我想我也可以通过 lpSecurityAttributes 参数在对 CreateNamedPipe 的初始调用中设置它。这看起来像是将其扩展到管理员组之外的方法...将所有者和/或主要组设置为特定的 SID,并在客户端检查该 SID。标记为答案,但将在接下来的几天内对其进行测试。
    • 使用 lpSecurityAttributes 的缺点是它意味着你必须显式地构造 DACL。当然,如果默认 DACL 不合适,您可能仍希望这样做。请注意,如果不先启用恢复权限,您就无法分配任意 SID,而且(如果我没记错的话)管理员组是一个特例;不能将其他组指定为所有者,除非使用恢复权限覆盖通常的规则。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    • 2020-09-03
    • 1970-01-01
    相关资源
    最近更新 更多