Comment puis-je identifier le propriétaire d'un fichier ?

S'il vous plaît Docteur Script...

Hey, Scripting Guy!

Bienvenue dans cette nouvelle section TechNet, dans laquelle le Docteur Script de Microsoft répond aux questions récurrentes sur les scripts d'administration système. Vous avez une question sur les scripts d'administration système ?

Question du jour : comment puis-je identifier le propriétaire d'un fichier ?

Comment puis-je identifier le propriétaire d'un fichier ?Comment puis-je identifier le propriétaire d'un fichier ?

S'il vous plaît Docteur Script... Existe-t-il un moyen d'identifier le propriétaire d'un fichier à l'aide d'un script ?

-- BD

Bonjour BD. Il est effectivement possible d'utiliser un script pour identifier le propriétaire d'un fichier, et je comprends très bien que n'ayez pas trouvé seul la solution. En effet, il existe deux interfaces de scripts principales utilisées pour la gestion des fichiers : FileSystemObject de Script Runtime et CIM_DataFile de la classe WMI. Dans la mesure où ni l'une ni l'autre de ces interfaces ne présente de propriété ou de méthode visible d'identification du propriétaire d'un fichier, on peut logiquement en conclure que c'est impossible.

Mais, vous savez ce que c'est avec les scripts, il y a toujours une solution à tout, même si ce n'est pas celle à laquelle vous vous attendez. Dans ce cas, vous devez utiliser la classe Win32_LogicalFileSecuritySetting de WMI conjointement avec la classe d'association Win32_LogicalFileOwner pour identifier le propriétaire du fichier. Comme vous pouvez le deviner, la classe LogicalFileSecuritySetting capture les informations de sécurité d'un fichier. Par contre, elle ne peut pas vous donner le nom du propriétaire du fichier. C'est là que la classe Win32_LogicalFileOwner intervient : elle extrait le SID (identificateur de sécurité) du propriétaire et le transmet à la classe Win32_SID. La classe Win32_SID peut alors rechercher et divulguer le nom et le domaine du propriétaire.

Vous êtes perdu ? C'est normal, les classes d'association sont loin d'être intuitives. Heureusement, vous n'avez pas besoin de comprendre leur fonctionnement. Il vous suffit de savoir qu'elles fonctionnent. Par exemple, voici un script qui permet d'identifier le propriétaire du fichier C:\Scripts\Mon_script.vbs :

On Error Resume Next

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
      & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

strFile = "C:\Scripts\My_script.vbs"

Set colItems = objWMIService.ExecQuery _
    ("ASSOCIATORS OF {Win32_LogicalFileSecuritySetting='" & strFile & "'}" _ 
        & " WHERE AssocClass=Win32_LogicalFileOwner ResultRole=Owner")

For Each objItem in colItems
    Wscript.Echo objItem.ReferencedDomainName
    Wscript.Echo objItem.AccountName
Next

C'est un peu bizarre, mais ça marche. Et si vous voulez identifier le propriétaire d'un autre fichier, il n'y a aucun problème. Il vous suffit de remplacer la valeur de la variable strFile par le chemin complet du fichier.

Ne vous fiez pas à leur nom : ces deux classes peuvent également être utilisées pour identifier le propriétaire d'un dossier. Par exemple, le script suivant renvoie le nom du propriétaire du dossier C:\Scripts :

On Error Resume Next

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
      & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

strFile = "C:\Scripts"

Set colItems = objWMIService.ExecQuery _
    ("ASSOCIATORS OF {Win32_LogicalFileSecuritySetting='" & strFile & "'}" _ 
        & " WHERE AssocClass=Win32_LogicalFileOwner ResultRole=Owner")

For Each objItem in colItems
    Wscript.Echo objItem.ReferencedDomainName
    Wscript.Echo objItem.AccountName
Next
Pour en savoir plus

Consultez les archives de S'il vous plaît Docteur Script...