2013-01-24 16 views
5

Devo concedere l'accesso a tutti per una named pipe che sto creando. Capisco il modo per farlo è quello di creare un DACL NULL/vuoto e passarlo a CreateNamedPipe.Come posso creare un DACL NULL/vuoto?

Come si crea un DACL NULL? Mi è stato detto che non è lo stesso di passare un puntatore NULL per LPSECURITY_ATTRIBUTES.

risposta

9

Ti piace questa:

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

ho omesso controllo degli errori per brevità. Non lo faresti.

Poi quando si chiama CreateNamedPipe è possibile impostare la sicurezza attribuisce disco come questo:

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

La documentazione per SetSecurityDescriptorDacl stati:

Quando il parametro pDacl non punta a un DACL e il flag bDaclPresent è TRUE, viene specificato un DACL NULL. Tutto l'accesso è permesso. Non si dovrebbe utilizzare un DACL NULL con un oggetto perché qualsiasi utente può modificare DACL e proprietario del descrittore di sicurezza. Ciò interferirà con l'uso dell'oggetto.

Quindi, quanto sopra è come farlo, ma la documentazione sottolinea che non si dovrebbe fare così.

+0

Hm, la parte di cambiare la proprietà è stata una sorpresa. Ma nel mio caso non è un problema, ho solo bisogno di essere in grado di connettermi dal mio exe indipendentemente dall'utente che lo esegue, e il collegamento alla pipe non permetterà loro di hackerare il mio servizio Windows o altro. Ma è comunque interessante - è possibile concedere l'accesso a tutti per connettersi, senza consentire loro di cambiare proprietà? – sashoalm

+0

Sì, quindi è necessario utilizzare un DACL reale. Il codice nel mio commento alla tua domanda precedente spiega come lo faccio. –

4

Ecco il codice che utilizziamo in uno dei nostri progetti:

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

Questo codice crea una mappatura con accesso per tutti

+0

Perché usare una variabile puntatore ('pSA'), e non solo usare l'indirizzo di' SA'? – Ajay