divadav
Messages postés94Date d'inscriptionlundi 13 janvier 2003StatutMembreDernière intervention22 janvier 2009
-
18 oct. 2004 à 10:58
divadav
Messages postés94Date d'inscriptionlundi 13 janvier 2003StatutMembreDernière intervention22 janvier 2009
-
1 avril 2009 à 10:20
Bonjour à tous !!
Je vourais lister les droits d'un fichier où d'un répertoire (un peu comme quand on fait [Clic Droit][Propriétés][Onglet Sécurité]...), et j'utilise pour ça des fonctions bas-niveau de windows comme GetFileSecurity, GetSecurityDescriptorControl, GetSecurityDescriptorDacl et GetExplicitEntriesFromAcl...
Et je bute sur cette dernière !!
En fait, j'arrive bien à récupérer un pointeur vers la liste de contrôle d'accès de l'objet (DACL), mais je n'arrive pas à récupérer les entrées de cette liste (ACE).
Le fonction GetExplicitEntriesFromAcl me renvoie le code d'erreur 87, soit "Paramètres incorrect", et je n'arrive pas à trouver pourquoi...
Quelqu'un peut m'aider ??
Je laisse mon code, il doit y avoir une erreur dedans :
unit frmMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, aclAPI, accCtrl, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
private
{ Déclarations privées }
procedure TrouverACL(sObjet: String);
public
{ Déclarations publiques }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TForm1 }
procedure TForm1.TrouverACL(sObjet: String);
var
FiName : PChar; // Nom de l'objet
psd : PSECURITY_DESCRIPTOR; // Pointeur vers le Descripteur de Sécurité
dwLen : DWORD; // Taille du descripteur de sécurité
lpbDaclPresent : Bool; // Présence du DACL
lpbDaclDefaulted : Bool; // DACL automatique (hérité)
pDacl : PACL; // Pointeur vers le DACL
nNbEntries : Cardinal; // Nb d'entrées (d'ACE)
pListEntries : PEXPLICIT_ACCESS_A; // Pointeur vers un tableau de
// structures de type EXPLICIT_ACCESS
begin
// Initialisation
FiName := PChar(sObjet + #0);
pDacl := nil;
psd := nil;
dwLen := 0;
nNbEntries := 0;
pListEntries := nil;
GetFileSecurity(FiName,DACL_SECURITY_INFORMATION,psd,0,dwLen);
psd := AllocMem(dwLen);
// Récup des infos de sécurité (psd)
try
if not GetFileSecurity(PChar(FiName),DACL_SECURITY_INFORMATION,psd,dwLen,dwLen) then begin
ShowMessage(SysErrorMessage(GetLastError));
exit;
end;
// Récup de la liste de contrôle d'accès (pDacl)
GetSecurityDescriptorDacl(psd, lpbDaclPresent, pDacl, lpbDaclDefaulted);
IF lpbDaclPresent then begin
If pDacl = nil Then Memo1.lines.add('DACL nul : Accès total')
Else begin
Memo1.lines.add('DACL-ACL-Count: ' + inttostr(pDacl^.AceCount));
Memo1.lines.add('DACL-ACL-Size: ' + inttostr(pDacl^.AclSize));
// Récup d'un tableau contenant les ACE (pListEntries)
GetExplicitEntriesFromAcl(pDacl^, nNbEntries, pListEntries);
End;
end else begin
Memo1.Lines.Add('Pas de DACL');
end;
finally
FreeMem(psd,dwLen);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
TrouverACL(Nom du fichier ou dossier à voir);
end;
end.
procedure TForm1.TrouverACL(sObjet: String);
var
FiName : PChar; // Nom de l'objet
psd : PSECURITY_DESCRIPTOR; // Pointeur vers le Descripteur de Sécurité
dwLen : DWORD; // Taille du descripteur de sécurité
lpbDaclPresent : Bool; // Présence du DACL
lpbDaclDefaulted : Bool; // DACL automatique (hérité)
pDacl : PACL; // Pointeur vers le DACL
nNbEntries : Cardinal; // Nb d'entrées (d'ACE)
pListEntries : PEXPLICIT_ACCESS_; // Pointeur vers un tableau de
pEntry : PChar;
// structures de type EXPLICIT_ACCESS
i : Integer;
begin
// Récup des infos de sécurité (psd)
try
if not GetFileSecurity(PChar(FiName),DACL_SECURITY_INFORMATION,psd,dwLen,dwLen) then begin
ShowMessage(SysErrorMessage(GetLastError));
exit;
end;
// Récup de la liste de contrôle d'accès (pDacl)
GetSecurityDescriptorDacl(psd, lpbDaclPresent, pDacl, lpbDaclDefaulted);
IF lpbDaclPresent then
begin
If pDacl = nil Then Memo1.lines.add('DACL nul : Accès total')
Else
begin
Memo1.lines.add('DACL-ACL-Count: ' + inttostr(pDacl^.AceCount));
Memo1.lines.add('DACL-ACL-Size: ' + inttostr(pDacl^.AclSize));
// Récup d'un tableau contenant les ACE (pListEntries)
if GetExplicitEntriesFromAcl(pDacl^, nNbEntries, @pListEntries) = ERROR_SUCCESS then
begin
try
for i := 0 to pDacl^.AceCount - 1 do
begin
pEntry := (PChar(pListEntries) + i * sizeof(EXPLICIT_ACCESS)) ;
Memo1.Lines.Add('grfAccessPermissions[' + Inttostr(i) + '] = ' +
IntToStr(PEXPLICIT_ACCESS_(pEntry)^.grfAccessPermissions));
end;
finally
LocalFree(HLOCAL(pListEntries));
end;
end;
End;
end
else
begin
Memo1.Lines.Add('Pas de DACL');
end;
finally
FreeMem(psd,dwLen);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
TrouverACL('c:\Master.txt');
end;
cs_leveugle
Messages postés27Date d'inscriptionlundi 8 mars 2004StatutMembreDernière intervention18 novembre 2004 18 oct. 2004 à 14:32
Salut,
il s'agit juste d'une erreur de niveau de pointeur.
La fonction admet un pointeur de pointeur sur tableau
et tu ne luitransmets qu'un pointeur de tableau. voici la correction a faire :
divadav
Messages postés94Date d'inscriptionlundi 13 janvier 2003StatutMembreDernière intervention22 janvier 20092 18 oct. 2004 à 14:45
Merci beaucoup !! C'est ça !!
Et maintenant, dernière question...
Comment puis-je lire le tableau transmis ?
Je pense qu'il faut que je déclare un tableau de structure EXPLICIT_ACCESS, puis que je réalloue la mémoire de ce tableau en fonction du nombre d'ACE, mais je connais pas la syntaxe de tout ça...