Droits NTFS

Résolu
divadav Messages postés 94 Date d'inscription lundi 13 janvier 2003 Statut Membre Dernière intervention 22 janvier 2009 - 18 oct. 2004 à 10:58
divadav Messages postés 94 Date d'inscription lundi 13 janvier 2003 Statut Membre Dernière intervention 22 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.


Merci d'avance !!

Keep Cool & Be Wild
Divad

6 réponses

cs_leveugle Messages postés 27 Date d'inscription lundi 8 mars 2004 Statut Membre Dernière intervention 18 novembre 2004
18 oct. 2004 à 15:32
Salut,

voici ton code complété qui a l'air de fonctionner.

A+

Damien

unit Unit1;

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_; // Pointeur vers un tableau de
pEntry : PChar;
// structures de type EXPLICIT_ACCESS
i : Integer;
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)
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;

end.
3
cs_leveugle Messages postés 27 Date d'inscription lundi 8 mars 2004 Statut Membre Dernière intervention 18 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 :

GetExplicitEntriesFromAcl(pDacl^, nNbEntries, @pListEntries)

Damien
0
divadav Messages postés 94 Date d'inscription lundi 13 janvier 2003 Statut Membre Dernière intervention 22 janvier 2009 2
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...

Keep Cool & Be Wild
Divad
0
divadav Messages postés 94 Date d'inscription lundi 13 janvier 2003 Statut Membre Dernière intervention 22 janvier 2009 2
18 oct. 2004 à 16:04
Merci beaucoup, mais en fin de compte j'ai réussi à faire un tableau de structure et à l'utiliser...

C'est plus simple, et un peu plus lisible pour moi !!

Keep Cool & Be Wild
Divad
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Ivanov Messages postés 8 Date d'inscription mercredi 22 décembre 2004 Statut Membre Dernière intervention 1 avril 2009
1 avril 2009 à 09:52
Salut Divadav,

Ton sujet m'intéresse fortement. Peux-tu poster ton code final qui fonctionne?
0
divadav Messages postés 94 Date d'inscription lundi 13 janvier 2003 Statut Membre Dernière intervention 22 janvier 2009 2
1 avril 2009 à 10:20
Désolé, ça date de 5ans, j'ai changé de boîte depuis et ça fait bien longtemps que je ne fait plus de Delphi... Et je n'ai plus ce code !!

<hr size="2" width="100%" />Divad
Techniques de Web Design, Traductions d'articles sur le Web Design, Astuces .Net
0
Rejoignez-nous