2013-01-24 14 views
5

Muszę przyznać dostęp wszystkim do nazwanego potoku, który tworzę. Rozumiem, że sposobem na zrobienie tego jest utworzenie NULL/pustego DACL i przekazanie go do CreateNamedPipe.Jak utworzyć NULL/pusty DACL?

Jak utworzyć NULL DACL? Powiedziano mi, że to nie jest to samo, co podanie wskaźnika NULL dla LPSECURITY_ATTRIBUTES.

Odpowiedz

9

Jak to:

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

pominąłem błąd sprawdzanie zwięzłości. Nie zrobiłbyś tego.

Wtedy, kiedy zadzwonić CreateNamedPipe można skonfigurować zabezpieczenia rekordu atrybutów tak:

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

Dokumentacja SetSecurityDescriptorDacl stanach:

Gdy parametr pDacl nie wskazują na DACL i flaga bDaclPresent ma wartość TRUE, podano NULL DACL. Cały dostęp jest dozwolony. Nie powinieneś używać NULL DACL z obiektem, ponieważ każdy użytkownik może zmienić listę DACL i właściciela deskryptora bezpieczeństwa. Będzie to przeszkadzać w korzystaniu z obiektu.

Tak, powyższe jest, jak to zrobić, ale dokumentacja podkreśla, że ​​nie należy tego robić.

+0

Hm, część o zmianę własności było zaskoczeniem. Ale w moim przypadku to nie problem, po prostu muszę mieć możliwość połączenia się z moim exe, niezależnie od użytkownika, który go uruchamia, a połączenie z rurą nie pozwoli im zhakować mojej usługi systemu Windows lub cokolwiek. Ale nadal jest to interesujące - czy można zezwolić na dostęp wszystkim, aby się połączyć, bez możliwości zmiany właściciela? – sashoalm

+0

Tak, to trzeba użyć prawdziwego DACL. Kod w moim komentarzu na poprzednim pytaniu wyjaśnia, jak to robię. –

4

Oto kod używamy w jednym z naszych projektów:

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); 

Kod ten tworzy odwzorowanie z dostępem dla wszystkich

+0

Dlaczego warto używać zmiennej wskaźnika ('pSA'), a nie tylko używać adresu' SA'? – Ajay