Windows中的本地系统唯一ACL

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

我正在构build和ACL中使用传递给CreateNamedPipe的SECURITY_ATTRIBUTES。

我将这个代码从微软的基础 。

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

然后我用AddAccessAllowedAce使用该sid。

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

如何创build一个允许本地机器的任何用户访问它的SID的ACL?

你不需要ACL。 当调用CreateNamedPipe时,其中一个参数将采用PIPE_ACCEPT_REMOTE_CLIENTS(缺省值)或PIPE_REJECT_REMOTE_CLIENTS的标志值。

MSDN

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

恐怕这是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将实际上允许和不允许不同的用户。