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

divadav
|
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
|
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
|
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
|
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
Livres en rapport
|
Derniers Blogs
TECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICESTECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICES par ROMELARD Fabrice
Animé par: Gaetan Bouveret et Julien Chomarat Business Connectivity Services (BCS) est dans SharePoint 2010 la version 2 de Business Data Catalog (BDC dans SharePoint 2007). Il s'agit de la solution permettant de visualiser des données provenan...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE[DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE par orion
Comme de nombreux geek, je suis un grand amateur de série TV et je rate régulièrement des épisodes de mes séries préférés. Une solution s'offre à vous avec ce merveilleux site : Tv Gorge - www.tvgorge.com Moteur de recherche à l'appui, vous pouvez ...
Cliquez pour lire la suite de l'article par orion TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Vincent Bellet et Baptiste Giraudier La BI dans SharePoint 2010, Les nouveaux services d'application dans SP2010 et SQL Server Reporting services 2008 R2. La BI dans SharePoint est généralisée pour tous afin de permettre à tous les coll...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2010 : PLAN DE MIGRATION VERS SHAREPOINT 2010TECHDAYS PARIS 2010 : PLAN DE MIGRATION VERS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Arnault Nouvel et Antoine Dongois Le processus à prendre : Apprendre (découvrir la plateforme) Préparer (documenter l'historique et choisir la méthode de MAJ) Test (Test de MAJ) Implémenter (Effectuer la MAJ) Valid...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
|