2013-01-24 54 views
5

我需要爲我創建的命名管道授予每個人的訪問權限。我理解的方式是創建一個NULL /空DACL並將其傳遞給CreateNamedPipe如何創建NULL /空DACL?

如何創建一個NULL DACL?我被告知這不同於傳遞LPSECURITY_ATTRIBUTES的NULL指針。

回答

9

像這樣:

SECURITY_DESCRIPTOR SD; 
InitializeSecurityDescriptor(&SD, SECURITY_DESCRIPTOR_REVISION); 
SetSecurityDescriptorDacl(&SD, TRUE, NULL, FALSE); 

我省略了錯誤檢查簡潔起見。你不會那樣做。

然後當你調用CreateNamedPipe你可以設置安全屬性這樣的記錄:

SA.nLength = sizeof(SA); 
SA.lpSecurityDescriptor = &SD; 
SA.bInheritHandle = TRUE; 

SetSecurityDescriptorDacl狀態的文檔:

當pDacl參數不指向一個DACL和bDaclPresent標誌爲TRUE,指定一個NULL DACL。所有訪問都是允許的。您不應該將NULL DACL與對象一起使用,因爲任何用戶都可以更改安全描述符的DACL和所有者。這會干擾物體的使用。

所以,上面是如何做到這一點,但文件強調,你不應該這樣做。

+0

嗯訪問一個映射,有關更改所有權的部分是一個驚喜。但在我的情況下,這不是問題,我只需要能夠從我的exe連接,無論運行它的用戶,並連接到管道不會讓他們破解我的Windows服務或任何東西。但它仍然很有趣 - 可以授予每個人連接的權限,但不允許他們更改所有權? – sashoalm

+0

是的,那麼你需要使用真正的DACL。您在上一個問題中的評論中的代碼解釋了我如何做到這一點。 –

4

下面是我們在我們的項目中的一個使用的代碼:

SECURITY_DESCRIPTOR pSD; 
SECURITY_ATTRIBUTES SA; 

if(!InitializeSecurityDescriptor(&pSD, SECURITY_DESCRIPTOR_REVISION)) 
    throw error; 
if(!SetSecurityDescriptorDacl(&pSD, true, NULL, false)) 
    throw error; 
SA.nLength = sizeof(SA); 
SA.lpSecurityDescriptor = &pSD; 
SA.bInheritHandle = true; 
pSA = &SA; 
... 
FMapping = CreateFileMapping(INVALID_HANDLE_VALUE, pSA, PAGE_READWRITE, 0, 4096, p); 

此代碼創建與所有

+0

爲什麼要使用指針變量('pSA'),而不僅僅是使用'SA'的地址? – Ajay