Bonjour,
Je galère avec la gestion des droits NTFS sur un fichier.
J'ai regardé GetFileSecurity & Co.
Je voudrais savoir s'il y a un moyen simple de donner l'accès total à mon fichier pour tout le monde.
Merci
Bonjour,
Je galère avec la gestion des droits NTFS sur un fichier.
J'ai regardé GetFileSecurity & Co.
Je voudrais savoir s'il y a un moyen simple de donner l'accès total à mon fichier pour tout le monde.
Merci
Pour ça, tu dois toujours utiliser GetFileSecurity(), puis le plus simple est de supprimer complètement la DACL (Discretionary Access Control List) dans le Security Descriptor. Passer NULL à la place.
Si je me souviens bien, il doit y avoir une fonction du genre SetSecurityDescriptorDacl() qui doit permettre de faire ça...
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Ok,
je suis dans la bonne voie.
J'avais commencé par AddAccessAllowedAce & Co, mais je n'arrive à rien.
Il y a plein d'exemple sur le Net, mais il faut passer le nom de l'utilisateur, style "tout le monde", sympa mais bon, sur un OS anglais (voire chinois dans mon cas), ça risque de ne pas marcher.
Bref, j'ai trouvé une solution avec : SID_IDENTIFIER_AUTHORITY siaWorld = SECURITY_WORLD_SID_AUTHORITY;
qui a l'air d'etre "tout le monde".
Pour le moment, j'ai ca :
mais manque de bol, j'ai dwError = 122 : taille de buffer insuffisante, bizarre !!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 SECURITY_DESCRIPTOR SecDesc; DWORD lSizeNeeded; DWORD dwError; GetFileSecurity(szPath, OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION, 0, 0, &lSizeNeeded); if (GetFileSecurity(szPath, OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION, &SecDesc, lSizeNeeded, &lSizeNeeded)) { dwError = GetLastError(); }
Je continue à investiguer !
Plutôt que d'ajouter tous les droits pour "tous le monde", supprime carrément l'ACL, ça ira plus vite pour le même effet.
PS: Il manque l'allocation du buffer dans ton code...
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Merci pour ton aide, entre temps j'ai corrigé le pb d'allocation.
Mais comment supprime-t-on l'ACL ?
Pour le moment, j'ai ca :
mais SetFileSecurity me retourne 1305 : ERROR_UNKNOWN_REVISION
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 SID_IDENTIFIER_AUTHORITY siaWorld = SECURITY_WORLD_SID_AUTHORITY; BOOL bRet = AllocateAndInitializeSid(&siaWorld, 1, SECURITY_WORLD_RID,0, 0, 0, 0, 0, 0, 0, &pSidEveryone); DWORD dwAclSize; dwAclSize = sizeof(ACL) + 3 * ( sizeof(ACCESS_ALLOWED_ACE) - sizeof(DWORD) ) + GetLengthSid(pSidEveryone); PACL pDacl = NULL; pDacl = (PACL)HeapAlloc(GetProcessHeap(), 0, dwAclSize); if(pDacl == NULL) { printf("ERROR: pDacl = NULL\n"); } if(!InitializeAcl(pDacl, dwAclSize, ACL_REVISION)) { printf("ERROS: Ini Acl\n"); } bRet = AddAccessAllowedAce(pDacl,ACL_REVISION,KEY_ALL_ACCESS,pSidEveryone) ; if (bRet == NULL) { int err = GetLastError(); return -2; } bRet = SetFileSecurity(szPath, DACL_SECURITY_INFORMATION,pDacl);
Désolé, mon code de test commence à être de plus en plus déguelasse.
à l'origine j'ai ca :
Sauf que le groupe "Utilisateurs" a un accès en lecture seul.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 HANDLE hRet = CreateFile(szPath, 0, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL );
Partager