2009-07-08 12 views
2

J'essaie d'activer et de désactiver certains privilèges d'accès sur un fichier. J'ai compris que pour ce faire, vous devez jouer avec les DACL. J'utilise le code suivant pour modifier le DACL du fichier:Est-ce que j'utilise SetNamedSecurityInfo de manière incorrecte? La liste de contrôle d'accès de mon fichier ne semble pas être modifiée correctement

void set_DACL_for_object(const char *object, SE_OBJECT_TYPE object_type, 
          int access_perms, int access_mode) { 

     PACL pDACL = NULL, pOldDACL = NULL; 
     PSECURITY_DESCRIPTOR pSD = NULL; 
     EXPLICIT_ACCESS ea; 

     GetNamedSecurityInfo((LPTSTR)object, object_type, 
          DACL_SECURITY_INFORMATION, NULL, NULL, 
          &pOldDACL, NULL, &pSD); 

     ZeroMemory(&ea, sizeof(EXPLICIT_ACCESS)); 

     ea.grfAccessPermissions = access_perms; 
     ea.grfAccessMode = access_mode; 
     ea.grfInheritance = NO_INHERITANCE; 
     ea.Trustee.TrusteeForm = TRUSTEE_IS_NAME; 
     ea.Trustee.TrusteeType = TRUSTEE_IS_GROUP; 
     ea.Trustee.ptstrName = _T("ADMINISTRATORS"); 

     SetEntriesInAcl(1, &ea, pOldDACL, &pDACL); 

     SetNamedSecurityInfo((LPTSTR)object, object_type, 
          DACL_SECURITY_INFORMATION, NULL, NULL, pDACL, NULL); 
} 

Alors d'abord je crée un fichier avec fopen(), la création d'un ACL pour donner tous les accès au groupe Administrateurs, puis refuser l'accès en écriture au groupe Administrateurs:

set_DACL_for_object("C:\\file.txt", SE_FILE_OBJECT, GENERIC_ALL, SET_ACCESS); 
set_DACL_for_object("C:\\file.txt", SE_FILE_OBJECT, GENERIC_WRITE, DENY_ACCESS); 

Cependant, après ces appels que je n'ont pas accès en lecture au fichier. Si je ne fais pas les appels, j'ai un accès en lecture/écriture (comme prévu).

Je devrais noter que je cours sous un compte d'admin et les fonctions retournent comme succès. J'ai également essayé de modifier la liste de contrôle d'accès pour un utilisateur limité spécifique, mais la même chose arrive ... l'utilisateur se voit refuser l'accès en lecture, pas l'accès en écriture comme je le voulais.

J'ai essayé plusieurs combinaisons d'appels à set_DACL_for_object(), comme remplacer DENY_ACCESS par REVOKE_ACCESS, SET_ACCESS avec GRANT_ACCESS, ne faire aucun appel à SET_ACCESS, etc, mais rien ne semble fonctionner.

Je devrais noter, la plupart du code a été pris de this MSDN example, donc je pense que cela devrait fonctionner. Qu'est-ce que je fais de mal?

Répondre

4

Ouvrir et lire dans quel programme? La liste de contrôle d'accès a été définie comme prévu, mais FILE_GENERIC_WRITE est peut-être trop générique pour vos besoins. il semble que cela définit également une permission «spéciale» qui affecte les attributs de lecture.

de winnt.h:

#define FILE_GENERIC_WRITE  (STANDARD_RIGHTS_WRITE |\ 
            FILE_WRITE_DATA   |\ 
            FILE_WRITE_ATTRIBUTES |\ 
            FILE_WRITE_EA   |\ 
            FILE_APPEND_DATA   |\ 
            SYNCHRONIZE) 

si j'appelle un ensemble plus restreint de drapeaux le fichier de test peut désormais être ouvert et lu, au moins dans le bloc-notes, mais l'utilisateur administrateur ne peut pas enregistrer le document :

DWORD dwCustomWrite = FILE_WRITE_DATA  | 
         FILE_WRITE_ATTRIBUTES | 
         FILE_WRITE_EA   | 
         FILE_APPEND_DATA; 
set_DACL_for_object(..., SE_FILE_OBJECT, dwCustomWrite, DENY_ACCESS); 

sur la liste des autorisations avancées de l'onglet de sécurité sur le fichier, avec l'appel ci-dessus que les éléments suivants sont marqués comme « nier » pour le groupe « administrateurs »:

« Créer des fichiers/écriture des données », « créer des dossiers/ajouter des données », « Write attribue », « Ecrire attributs étendus »

Avec cette connaissance, vous devriez être en mesure de choisir l'ensemble exact des drapeaux que vous avoir besoin.

+0

Merci! C'est ce qu'il a fait. Après avoir répondu à votre première réponse, j'ai démarré en mode sans échec et vérifié les informations de sécurité sur le fichier que je créais et en modifiant l'ACL pour. J'ai remarqué que l'accès en écriture était en effet refusé, et que l'accès en lecture était autorisé ... mais il y avait aussi des permissions spéciales refusées. Merci de m'avoir indiqué la bonne direction, maintenant ça marche. – ZZZzzz

1

Je pense que les appels set_DACL_for_object doivent préciser FILE_ALL_ACCESS et FILE_GENERIC_WRITE, non GENERIC_ALL et GENERIC_WRITE. J'ai compilé votre extrait de code avec ces changements et cela a fonctionné comme prévu. En guise de note, le cast LPTSTR empêche le compilateur de détecter que ce code est Ansi si vous compilez cela en Unicode, donc le code échouera à l'exécution dans ce cas. Vous devez utiliser _T("ADMINISTRATORS") à la place.

+0

Merci; J'ai essayé cela, et il produit toujours les mêmes résultats pour moi (je ne peux pas lire le fichier).Sur votre système, l'appel de ces deux fonctions - SET_ACCESS pour FILE_ALL_ACCESS et DENY_ACCESS pour FILE_GENERIC_WRITE - vous permet d'ouvrir le fichier et de le lire, mais pas de l'écrire? – ZZZzzz