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?
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