2009-07-13 39 views
1

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

我正在构建和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; 
} 

然后我用AddAccessAllowedAce使用该sid。

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

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

+0

除了为“网络”ACE添加访问被拒绝的令牌之外,我认为您需要为“所有人”或“经过身份验证的用户”添加一个访问允许的令牌。 – 2009-07-13 06:21:41

回答

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实际上将允许和禁止不同的用户连接并。

3

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

MSDN

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

+0

是的,这个标志很有用,但不幸的是这是针对需要在Windows 2000及更高版本上运行的服务。 – JProgrammer 2009-07-13 06:12:11