Windows中仅本地系统ACL

时间:2009-07-13 05:32:51

标签: c++ windows mfc

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

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

我的代码基于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?

2 个答案:

答案 0 :(得分:3)

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

MSDN

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

答案 1 :(得分:1)

我担心这是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实际上允许和禁止不同的用户。