OBTENIR LE PROPRIÉTAIRE D'UN FICHIER (WIN32;NTFS)

Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 - 11 sept. 2009 à 10:07
phephelavi Messages postés 40 Date d'inscription mardi 16 mai 2006 Statut Membre Dernière intervention 27 octobre 2009 - 1 oct. 2009 à 14:51
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/50551-obtenir-le-proprietaire-d-un-fichier-win32-ntfs

phephelavi Messages postés 40 Date d'inscription mardi 16 mai 2006 Statut Membre Dernière intervention 27 octobre 2009
1 oct. 2009 à 14:51
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
cs_ILP Messages postés 28 Date d'inscription vendredi 14 février 2003 Statut Membre Dernière intervention 24 septembre 2012
23 sept. 2009 à 21:22
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.
phephelavi Messages postés 40 Date d'inscription mardi 16 mai 2006 Statut Membre Dernière intervention 27 octobre 2009
23 sept. 2009 à 20:52
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
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
22 sept. 2009 à 06:47
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 !
phephelavi Messages postés 40 Date d'inscription mardi 16 mai 2006 Statut Membre Dernière intervention 27 octobre 2009
21 sept. 2009 à 19:21
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à ?
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
21 sept. 2009 à 17:49
Sur la page http://msdn.microsoft.com/en-us/library/aa446639%28VS.85%29.aspx, il est écrit :"The information obtained is constrained by the caller's access rights and privileges."

@phphelavi :
1- as-tu les droits nécessaires pour lire ces informations ?
2- As-tu lancé l'exécution de ton programme en tant qu'administrateur ? ("Exécuter en tant que...")
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
21 sept. 2009 à 14:32
Je suis également sous V1st4 H0me Pr3m1um SP1, et je reçois que du charabia pour n'importe-quel fichier (genre "^$$$$$$$$"). Il est "possible" que Vista gère différemment la sécurité (lol). Enfin bref, tout ça pour dire que c'est incompatible avec Vista SP1 sous certaines conditions.
Mais de toute façon je suis en veille tant que j'ai pas Windows 7 !

Cordialement, Bacterius !
phephelavi Messages postés 40 Date d'inscription mardi 16 mai 2006 Statut Membre Dernière intervention 27 octobre 2009
21 sept. 2009 à 14:24
OUi, je suis bien en NTFS et non en FAT 32 !
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
21 sept. 2009 à 12:16
@phephelavi : as-tu vérifié que ta partition disque est en NTFS ?
phephelavi Messages postés 40 Date d'inscription mardi 16 mai 2006 Statut Membre Dernière intervention 27 octobre 2009
21 sept. 2009 à 12:01
J'utilise Windows Vista Home Premium Service Pack 1 !

J'ai aucun retour sur n'importe quel fichier !

Merci pour ton aide !
cs_ILP Messages postés 28 Date d'inscription vendredi 14 février 2003 Statut Membre Dernière intervention 24 septembre 2012
21 sept. 2009 à 10:27
@phephelavi tu utilises quelle version de Windows ? Apparament, sous Windows 2000 il y a quelques bugs de mise à jour du cache SID. Il faut avoir le SP2 au minimum si j'ai bien compris.
phephelavi Messages postés 40 Date d'inscription mardi 16 mai 2006 Statut Membre Dernière intervention 27 octobre 2009
21 sept. 2009 à 09:38
Bonjour ILP,

J'ai testé et incorporé votre code dans une de mes application mais je n'obtiens aucune information concernant le compte et domaine !!!!

Voici mon code :

ar
NomCompte, NomDomaine : string;

begin
ShowMessage(NodeFichier);
if FileExists(NodeFichier)
then begin
FileSecurityInfos(NodeFichier, NomCompte, NomDomaine);
if (NomCompte <> '') and (NomDomaine <> '')
then ShowMessage(NomCompte + ' - ' + NomDomaine);
end;
end;

J'ai vérifié sur plusieurs fichiers, avez-vous une explication ? Je n'ai jamais d'erreurs mais les variables sont vides ?
Merci pour votre réponse
cs_ILP Messages postés 28 Date d'inscription vendredi 14 février 2003 Statut Membre Dernière intervention 24 septembre 2012
15 sept. 2009 à 14:25
Voilà, j'ai changé un peu la structure du programme pour qu'il soit un peu moins trivial. Maintenant la récupèration des informations de sécurités des fichiers se fait par une fonction. Ça permettera aux personnes voulant utiliser ce code de l'importer plus facilement.
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
14 sept. 2009 à 22:51
Ce code est suffisamment court et clair pour être adaptable aux besoins de chacun.
Néanmoins, que se passe-t-il si on n'est pas en présence d'une partition NTFS ?

Dans cette partie du code :
if ParamCount > 0 then
fic := PChar(ParamStr(1));

Ne serait-il pas souhaitable de tester si le fichier fic existe avant de continuer ?

D'autre part Delphi '2009) renvoie une première erreur sur la ligne d'affectation à la variable fic :
[DCC Erreur] Project4.dpr(24): E2010 Types incompatibles : 'Char' et 'AnsiChar'
Il faudra donc remplacer tous les LPSTR par des PChar.
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
12 sept. 2009 à 11:40
"mais pas toujours les locales"
jamais les locales..
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
12 sept. 2009 à 09:59
En fait c'est plus traitre que ça, lorsque tu lances depuis Delphi, j'ai remarqué que généralement c'était le cas, l'espace alloué était initialisé à zéro (peut-être que ça a à voir avec le debugger?). Mais en lançant le prog normalement c'est là que les problèmes apparaissent, le contenu de la RAM allouée est aléatoire.
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
12 sept. 2009 à 09:53
En Delphi 6 ou 7, les globales sont initialisées à zéro (mais pas toujours les locales). Enfin j'ai remarqué ça ...

Cordialement, Bacterius !
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
12 sept. 2009 à 09:43
Par rapport au commentaire de bacterius:
>lorsque tu déclares des variables, il est inutile de les initialiser à zéro ou nil, c'est fait automatiquement.
C'est vrai uniquement pour les champs de classe - qui eux sont initialisés à zéro par le "pré-constructeur" NewInstance. Les variables normales (globales ou locales) ne sont pas initialisées implicitement, du moins pas dans les anciennes versions de Delphi (mais peut-être en .net?).
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
11 sept. 2009 à 11:36
Un bon conseil, essaye d'en faire quelque chose d'utile (je ne parle pas du programme mais de l'utilisation de celui ci)

Si qq1 veut utiliser ceci dans un programme (ou même toi plus tard) tu devras changer qqch ds le code ...

Et un snippet serait plus approprié je pense ;)
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
11 sept. 2009 à 10:07
Ca ne mange pas de pain ...
Quelques conseils :
- lorsque tu déclares des variables, il est inutile de les initialiser à zéro ou nil, c'est fait automatiquement.
- si tu veux un retour à la ligne automatique, utilise WriteLn plutôt que Write.

Sinon, bon exemple d'utilisation de ces APIs.

Cordialement, Bacterius !
Rejoignez-nous