【问题标题】:Local System only ACL in WindowsWindows 中仅本地系统的 ACL
【发布时间】:2009-07-13 05:32:50
【问题描述】:

我正在使用命名管道在两个进程之间进行通信,并希望限制 Windows 本地系统上的任何用户访问。

我正在构建 ACL 以在传递给 CreateNamedPipe 的 SECURITY_ATTRIBUTES 中使用。

我将这段代码基于来自Microsoft 的代码。

SID_IDENTIFIER_AUTHORITY siaLocal = SECURITY_LOCAL_SID_AUTHORITY;
if( !AllocateAndInitializeSid( &siaLocal, SECURITY_LOCAL_RID,
    0, 0, 0, 0, 0, 0, 0, 0,
    &pSidLocal ) )
{
    break;
}

然后我将该 sid 与 AddAccessAllowedAce 一起使用。

所有这一切都成功完成,我可以创建命名管道,但是当客户端进程尝试使用 CreateFile 连接时,它会失败并拒绝访问。

如何创建具有 SID 的 ACL,允许本地计算机的任何用户访问它?

【问题讨论】:

  • 除了为“网络”ACE 添加一个拒绝访问令牌外,我认为您还需要为“所有人”或“经过身份验证的用户”添加一个允许访问令牌。

标签: c++ windows mfc


【解决方案1】:

您不需要 ACL。调用 CreateNamedPipe 时,其中一个参数采用 PIPE_ACCEPT_REMOTE_CLIENTS(默认)或 PIPE_REJECT_REMOTE_CLIENTS 的标志值。

MSDN

编辑:这是一个相当新的功能,所以如果您正在开发除新的 WS2008 服务器之外的任何东西,它将无法工作。但是,在这种情况下,同一页面有另一个答案:使用AddAccessDeniedAce 拒绝访问 NETWORK ACE 的管道。

【讨论】:

  • 是的,该标志很有用,但不幸的是,这适用于需要在 Windows 2000 及更高版本上运行的服务。
  • 太糟糕了,根据我的经验,不得不使用安全 API 总是很痛苦。
【解决方案2】:

恐怕这是 RTFM 和 c 完全缺乏严格类型的交叉。

AllocateAndInitializeSid的第二个参数实际上是子权限的计数,而不是第一个子权限。

所以通过将代码更改为:

SID_IDENTIFIER_AUTHORITY siaLocal = SECURITY_LOCAL_SID_AUTHORITY;
if( !AllocateAndInitializeSid( &siaLocal, 1,
    SECURITY_LOCAL_RID,
    0, 0, 0, 0, 0, 0, 0, 
    &pSidLocal ) )
{
    break;
}

我得到了想要的结果。

我已经用不同的帐户对此进行了测试,他们可以连接,通过将权限更改为 SECURITY_NT_AUTHORITY 并将子权限更改为 SECURITY_AUTHENTICATED_USER_RID 我能够从另一台计算机连接以测试此 ACL 是否实际上允许和禁止不同用户。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    • 2011-02-14
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多