2009-07-13 36 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