Obtenir le propriétaire d'un fichier (win32;ntfs)

Soyez le premier à donner votre avis sur cette source.

Vue 6 222 fois - Téléchargée 679 fois

Description

Je cherchais du code en Delphi pour connaitre le propriétaire d'un fichier, mais je n'ai trouvé que du code C.
http://www.cppfrance.com/article.aspx?ID=2224
J'ai donc fait une petite transcription en Pascal, pour ce que cela intéresse.
Ça utilise les API de sécurité de Windows NT pour connaitre le nom d'utilisateur ainsi que son domaine.

Source / Exemple :


procedure FileSecurityInfos(FileName: String;
  var AccountName, DomainName: String);
var
  fic: PChar;
  ssd: DWORD;
  psd: PSECURITY_DESCRIPTOR;
  sid: PSID;
  pFlag: BOOL;
  saccount: DWORD;
  account: PChar;
  sdomain: DWORD;
  domain: PChar;
  snu: SID_NAME_USE;
begin
  fic := PChar(FileName);
  GetFileSecurity(fic, OWNER_SECURITY_INFORMATION, nil, 0, ssd);
  psd := Pointer(GlobalAlloc(GMEM_FIXED, ssd));
  GetFileSecurity(fic, OWNER_SECURITY_INFORMATION, psd, ssd, ssd);
  GetSecurityDescriptorOwner(psd, sid, pFlag);
  LookupAccountSid(nil, sid, account, saccount, domain, sdomain, snu);
  account := Pointer(GlobalAlloc(GMEM_FIXED, saccount));
  domain := Pointer(GlobalAlloc(GMEM_FIXED, sdomain));
  LookupAccountSid(nil, sid, account, saccount, domain, sdomain, snu);
  AccountName := account;
  DomainName := domain;
end;

Conclusion :


Programme tout simple. À adapter si vous voulez l'inclure dans un projet.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
40
Date d'inscription
mardi 16 mai 2006
Statut
Membre
Dernière intervention
27 octobre 2009

Bonjour ILP,

Désolé de ne pas avoir répondu plutôt, mes occupations était ailleurs !

Voici le code que j'ai écrit dans mon programme :
-------------------------------------------------

var
NomCompte, NomDomaine : string;
NomFichier : string;

begin
NomFichier := 'C:\Test.bmp';
if FileExists(NomFichier)
then begin
FileSecurityInfos('C:\Test.bmp', NomCompte, NomDomaine);
ShowMessage(Format('Fichier : [%s]', [NomFichier]));
ShowMessage(Format('Compte : [%s]', [NomCompte]));
ShowMessage(Format('Domaine : [%s]', [NomDomaine]));
end
else ShowMessage(Format('Fichier [%s] inexistant.', [NomFichier]));

Voici le résultat obtenu pas à pas dans le déboggeur pour chaque procédure ou fonction :
----------------------------------------------------------------------------------------

Ligne prodédure ou fonction ce qu'elle m'a renvoyée
__________________________________________________________________ ________________________
- GetFileSecurity(fic, OWNER_SECURITY_INFORMATION, nil, 0, ssd) SSD vaut 1
- psd := Pointer(GlobalAlloc(GMEM_FIXED, ssd)) PSD vaut $2BD868
- GetFileSecurity(fic, OWNER_SECURITY_INFORMATION, psd, ssd, ssd) SSD vaut 36
- GetSecurityDescriptorOwner(psd, sid, pFlag); SSD vaut $2BD87C
PFLAG vaut false
- LookupAccountSid(nil, sid, account, saccount, domain, sdomain, snu); SACCOUNT vaut 4294966367
SDOMAIN vaut 4294967085
- account := Pointer(GlobalAlloc(GMEM_FIXED, saccount)); renvoie nil
- domain := Pointer(GlobalAlloc(GMEM_FIXED, sdomain)); renvoie nil
- LookupAccountSid(nil, sid, account, saccount, domain, sdomain, snu); SNU vaut 1244220
- AccountName := account; renvoie nil
- DomainName := domain; renvoie nil

Je n'ai pas d'erreur mais les champs sont vides !

Suite à la remarque de DELPHIPROG, j'ai normalement les droits d'administration puisque c'est mon ordninateur perso.
Comment puis-je vérifier que j'ai les droits d'administration ? Il est vrai que parfois, depuis un programme Delphi que je code, j'ai un refus
de mon ordinateur pour créer un fichier ! Avez-vous une explication ? Merci et bonne journée
Messages postés
28
Date d'inscription
vendredi 14 février 2003
Statut
Membre
Dernière intervention
24 septembre 2012

Bizarre, j'ai testé ce prog sous Windows XP et Vista Familial sans aucun problème. J'ai l'UAC d'activé sous Vista et j'ai lancé le programme à partir d'un compte ayant les droits d'aministrateur.
Est-ce que tu peux vérifier que la fonction GetFileSecurity retourne bien True. Sinon, récupèrer l'erreur avec GetLastError.
Dis moi ce qu'il en est.
Messages postés
40
Date d'inscription
mardi 16 mai 2006
Statut
Membre
Dernière intervention
27 octobre 2009

OK merci pout ton commentaire Bacterius. Il faudrait que ILP nous en dise un peu plus, peut-être que cela fonctionne sous XP. Bacterius, à part le faire par l'interface Windows, pouvez-vous m'informer à votre connaissance si il est possible de désactiver l'UAC par du code Delphi. Je ne parle pas de modifier les droits d'élévation de l'UAC mais de pourvoir le désactivere et de le réactiver. Merci pour votre réponse.

Cordialement
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
8
Moi je suis admin et j'ai les pleins pouvoirs sur mon ordi (heureusement), et j'ai désactivé l'UAC. Etrange ... à mon avis ça vient de l'API elle-même, peut-être est-elle "inofficiellement" obsolète à partir de Vista ?

Cordialement, Bacterius !
Messages postés
40
Date d'inscription
mardi 16 mai 2006
Statut
Membre
Dernière intervention
27 octobre 2009

Bonjour DelphiProg,

Je pense que oui, c'est mon ordinateur perso, je développe des programmes. Je epus supprimer des fichiers donc normalement je suis l'administrateur. Comment je peux vois les privilèges pour être sûr , Le fait que la procédure renvoie rien viendrai de là ?
Afficher les 20 commentaires

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.