Droits NTFS [Résolu]

divadav 97 Messages postés lundi 13 janvier 2003Date d'inscription 22 janvier 2009 Dernière intervention - 18 oct. 2004 à 10:58 - Dernière réponse : divadav 97 Messages postés lundi 13 janvier 2003Date d'inscription 22 janvier 2009 Dernière intervention
- 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
Afficher la suite 

6 réponses

Répondre au sujet
cs_leveugle 27 Messages postés lundi 8 mars 2004Date d'inscription 18 novembre 2004 Dernière intervention - 18 oct. 2004 à 15:32
+3
Utile
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.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_leveugle
cs_leveugle 27 Messages postés lundi 8 mars 2004Date d'inscription 18 novembre 2004 Dernière intervention - 18 oct. 2004 à 14:32
0
Utile
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
Commenter la réponse de cs_leveugle
divadav 97 Messages postés lundi 13 janvier 2003Date d'inscription 22 janvier 2009 Dernière intervention - 18 oct. 2004 à 14:45
0
Utile
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
Commenter la réponse de divadav
divadav 97 Messages postés lundi 13 janvier 2003Date d'inscription 22 janvier 2009 Dernière intervention - 18 oct. 2004 à 16:04
0
Utile
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
Commenter la réponse de divadav
cs_Ivanov 8 Messages postés mercredi 22 décembre 2004Date d'inscription 1 avril 2009 Dernière intervention - 1 avril 2009 à 09:52
0
Utile
Salut Divadav,

Ton sujet m'intéresse fortement. Peux-tu poster ton code final qui fonctionne?
Commenter la réponse de cs_Ivanov
divadav 97 Messages postés lundi 13 janvier 2003Date d'inscription 22 janvier 2009 Dernière intervention - 1 avril 2009 à 10:20
0
Utile
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
Commenter la réponse de divadav

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.