2013-01-24 3 views
5

Je dois accorder l'accès à tout le monde pour un tube nommé que je crée. Je comprends que la façon de le faire est de créer un DACL vide/vide et de le passer à CreateNamedPipe.Comment créer une liste DACL vide/vide?

Comment créer un DACL NULL? On m'a dit que ce n'est pas la même chose que de passer un pointeur NULL pour LPSECURITY_ATTRIBUTES.

Répondre

9

Comme ceci:

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

J'omis de contrôle d'erreur par souci de concision. Tu ne ferais pas ça.

Quand vous appelez CreateNamedPipe vous pouvez configurer les attributs de sécurité dossier comme celui-ci:

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

La documentation pour SetSecurityDescriptorDacl états:

Lorsque le paramètre pDacl ne pointe pas vers un DACL et l'indicateur bDaclPresent est TRUE, un DACL NULL est spécifié. Tout accès est autorisé. Vous ne devez pas utiliser un DACL NULL avec un objet car tout utilisateur peut modifier la liste DACL et le propriétaire du descripteur de sécurité. Cela interférera avec l'utilisation de l'objet.

Donc, ce qui précède est comment le faire, mais la documentation souligne que vous ne devriez pas le faire.

+0

Hm, la part de changer la propriété a été une surprise. Mais dans mon cas ce n'est pas un problème, je dois juste pouvoir me connecter à partir de mon exe indépendamment de l'utilisateur qui l'exécute, et se connecter au tuyau ne les laissera pas pirater mon service Windows ou quoi que ce soit. Mais il est toujours intéressant - est-il possible d'accorder l'accès à tout le monde à se connecter, sans leur permettre de changer de propriétaire? – sashoalm

+0

Oui, alors vous auriez besoin d'utiliser un vrai DACL. Le code dans mon commentaire à votre question précédente explique comment je fais cela. –

4

Voici le code que nous utilisons dans l'un de nos projets:

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

Ce code crée un mappage avec l'accès pour tous

+0

Pourquoi utiliser une variable de pointeur ('pSA'), et pas seulement utiliser l'adresse de' SA'? – Ajay

Questions connexes