begin process at 2010 02 10 00:19:56
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive Delphi

 > 

Archives

 > 

API

 > 

Droits NTFS


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Droits NTFS

lundi 18 octobre 2004 à 10:58:56 | Droits NTFS

divadav

Membre Club
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
lundi 18 octobre 2004 à 14:32:16 | Re : Droits NTFS

leveugle

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
lundi 18 octobre 2004 à 14:45:11 | Re : Droits NTFS

divadav

Membre Club
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
lundi 18 octobre 2004 à 15:32:21 | Re : Droits NTFS

leveugle

Réponse acceptée !
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.
lundi 18 octobre 2004 à 16:04:11 | Re : Droits NTFS

divadav

Membre Club
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
mercredi 1 avril 2009 à 09:52:51 | Re : Droits NTFS

Ivanov

Salut Divadav, Ton sujet m'intéresse fortement. Peux-tu poster ton code final qui fonctionne?
mercredi 1 avril 2009 à 10:20:00 | Re : Droits NTFS

divadav

Membre Club
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 !!


Divad
Techniques de Web Design, Traductions d'articles sur le Web Design, Astuces .Net


Cette discussion est classée dans : end, psd, dwlen, dacl, pdacl


Répondre à ce message

Sujets en rapport avec ce message

probleme dans mon programme [ par tarik ] monsieur kerad je crois que j'ai un bug dans mon programme ci-dessousprocedure TForm1.Button1Click(Sender: TObject);begintable1.open;try Table1.First urgent : code à corriger. Cela fait des jours que je suis dessus !!!!!! [ par Marcel ] Le code qui suit sert à créer un compte à rebours. Les 2 dernières lignes de ce code sont incorrecte car le compilateur signale:[Erreur]Unit1.pas(56): Erreur: Declaration forward ... [ par Lénaïc ] Avec le code ci-dessous j'ai une erreur "Déclaration forward ou external non satisfaite: 'TFrm_Perso.ComboAddFile'".Je n'arrive pas à trouver l'erreur Pb sur une classe pile [ par ninuko ] Aider moi, au secour!!!! URGENT!!!!!unit UntClasPile; { UntClasPile porteuse de la Classe pile Cette classe permet de : raise Exception.Create : gérer les exceptions ? [ par manudel ] Voilà je ne sais pas comment "catcher" une exception.L'exception se déclenche, et à mon avis remonte au niveau le plus haut, en cherchant un gestionna Datamodule et accès à partir d'une form [ par manudel ] Voilà, je voudrais avoir accès aux événements des objets figurant sur mon datamodule, mais je n'y arrive pas. J'ai l'erreur suivante : "le type de l'e visibilité procédures et fonctions dans une unit [ par manudel ] Je déclare une fonction qui renvoit un résultat de type TPersonne, et je voudrais savoircomment faire pour la mettre au même nivau de visibilité que l Code pas fiable dans un livre [:(!] [ par Youyou0214 ] Voil j'ai achet un livre sur delphi et je fais leurs exercises. Tout march pars un lanceur D'application. Il est compos d'une comboBox ( nom (c le n Index d'un table Dbase [ par webazard ] Bonjour, je crée un base Dbase indiqué dans l'aide de delphi en remplacant ttparadox par ttdbase.en supprimant la construction d'index min prog marche Hints dans une DLL [ par almi ] J'ai une fenêtre (TForm) qui fonctionne parfaitement dans mon executable.Si je la place dans une DLL, j'obtiens le message :Ne peut assigner TFont à T


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,484 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales