我需要爲我創建的命名管道授予每個人的訪問權限。我理解的方式是創建一個NULL /空DACL並將其傳遞給CreateNamedPipe
。如何創建NULL /空DACL?
如何創建一個NULL DACL?我被告知這不同於傳遞LPSECURITY_ATTRIBUTES
的NULL指針。
我需要爲我創建的命名管道授予每個人的訪問權限。我理解的方式是創建一個NULL /空DACL並將其傳遞給CreateNamedPipe
。如何創建NULL /空DACL?
如何創建一個NULL DACL?我被告知這不同於傳遞LPSECURITY_ATTRIBUTES
的NULL指針。
像這樣:
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和所有者。這會干擾物體的使用。
所以,上面是如何做到這一點,但文件強調,你不應該這樣做。
下面是我們在我們的項目中的一個使用的代碼:
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);
此代碼創建與所有
爲什麼要使用指針變量('pSA'),而不僅僅是使用'SA'的地址? – Ajay
嗯訪問一個映射,有關更改所有權的部分是一個驚喜。但在我的情況下,這不是問題,我只需要能夠從我的exe連接,無論運行它的用戶,並連接到管道不會讓他們破解我的Windows服務或任何東西。但它仍然很有趣 - 可以授予每個人連接的權限,但不允許他們更改所有權? – sashoalm
是的,那麼你需要使用真正的DACL。您在上一個問題中的評論中的代碼解釋了我如何做到這一點。 –