Question [Résolu] Excel: lecture de métadonnées

Plus d'informations
il y a 6 ans 6 mois #24131 par Marc
Bonjour à tous,

j'ai une liste de fichier excel et je souhaiterais récupérer la donnée \"Dernier Enregistrement par: username\"

Mon petit doigt me dit que l'info ce cache la dedans, mais j'avoue être perdu.

[code:1]
$DelivrableFiles[0].GetAccessControl()|gm


TypeName : System.Security.AccessControl.FileSecurity

Name MemberType Definition
----

Access CodeProperty System.Security.AccessControl.AuthorizationRuleCollection Access{get=Get...
Group CodeProperty System.String Group{get=GetGroup;}
Owner CodeProperty System.String Owner{get=GetOwner;}
Path CodeProperty System.String Path{get=GetPath;}
Sddl CodeProperty System.String Sddl{get=GetSddl;}
AccessRuleFactory Method System.Security.AccessControl.AccessRule AccessRuleFactory(System.Securi...
AddAccessRule Method void AddAccessRule(System.Security.AccessControl.FileSystemAccessRule rule)
AddAuditRule Method void AddAuditRule(System.Security.AccessControl.FileSystemAuditRule rule)
AuditRuleFactory Method System.Security.AccessControl.AuditRule AuditRuleFactory(System.Security...
Equals Method bool Equals(System.Object obj)
GetAccessRules Method System.Security.AccessControl.AuthorizationRuleCollection GetAccessRules...
GetAuditRules Method System.Security.AccessControl.AuthorizationRuleCollection GetAuditRules(...
GetGroup Method System.Security.Principal.IdentityReference GetGroup(type targetType)
GetHashCode Method int GetHashCode()
GetOwner Method System.Security.Principal.IdentityReference GetOwner(type targetType)
GetSecurityDescriptorBinaryForm Method byte[] GetSecurityDescriptorBinaryForm()
GetSecurityDescriptorSddlForm Method string GetSecurityDescriptorSddlForm(System.Security.AccessControl.Acces...
GetType Method type GetType()
ModifyAccessRule Method bool ModifyAccessRule(System.Security.AccessControl.AccessControlModific...
ModifyAuditRule Method bool ModifyAuditRule(System.Security.AccessControl.AccessControlModifica...
PurgeAccessRules Method void PurgeAccessRules(System.Security.Principal.IdentityReference identity)
PurgeAuditRules Method void PurgeAuditRules(System.Security.Principal.IdentityReference identity)
RemoveAccessRule Method bool RemoveAccessRule(System.Security.AccessControl.FileSystemAccessRule...
RemoveAccessRuleAll Method void RemoveAccessRuleAll(System.Security.AccessControl.FileSystemAccessR...
RemoveAccessRuleSpecific Method void RemoveAccessRuleSpecific(System.Security.AccessControl.FileSystemAc...
RemoveAuditRule Method bool RemoveAuditRule(System.Security.AccessControl.FileSystemAuditRule r...
RemoveAuditRuleAll Method void RemoveAuditRuleAll(System.Security.AccessControl.FileSystemAuditRul...
RemoveAuditRuleSpecific Method void RemoveAuditRuleSpecific(System.Security.AccessControl.FileSystemAud...
ResetAccessRule Method void ResetAccessRule(System.Security.AccessControl.FileSystemAccessRule ...
SetAccessRule Method void SetAccessRule(System.Security.AccessControl.FileSystemAccessRule rule)
SetAccessRuleProtection Method void SetAccessRuleProtection(bool isProtected, bool preserveInheritance)
SetAuditRule Method void SetAuditRule(System.Security.AccessControl.FileSystemAuditRule rule)
SetAuditRuleProtection Method void SetAuditRuleProtection(bool isProtected, bool preserveInheritance)
SetGroup Method void SetGroup(System.Security.Principal.IdentityReference identity)
SetOwner Method void SetOwner(System.Security.Principal.IdentityReference identity)
SetSecurityDescriptorBinaryForm Method void SetSecurityDescriptorBinaryForm(byte[] binaryForm), void SetSecurit...
SetSecurityDescriptorSddlForm Method void SetSecurityDescriptorSddlForm(string sddlForm), void SetSecurityDes...
ToString Method string ToString()
AccessRightType Property type AccessRightType {get;}
AccessRuleType Property type AccessRuleType {get;}
AreAccessRulesCanonical Property bool AreAccessRulesCanonical {get;}
AreAccessRulesProtected Property bool AreAccessRulesProtected {get;}
AreAuditRulesCanonical Property bool AreAuditRulesCanonical {get;}
AreAuditRulesProtected Property bool AreAuditRulesProtected {get;}
AuditRuleType Property type AuditRuleType {get;}
AccessToString ScriptProperty System.Object AccessToString {get=$toString = \"\";...
AuditToString ScriptProperty System.Object AuditToString {get=$toString = \"\";...
[/code:1]

Message édité par: Arnaud, à: 4/09/17 16:54<br><br>Message édité par: Arnaud, à: 27/09/17 11:29

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 6 ans 6 mois #24142 par Arnaud Petitjean
Bonjour Marcci,

Je pense que ton petit doigt se trompe sur ce coup-là... ;)

L'information que tu recherches n'est pas stockée dans NTFS mais est en fait une métadonnée d'un fichier Office.

Voici une petite fonction rapide inspirée du post suivant : Hey, Scripting Guy! How Can I List All the Properties of a Microsoft Word Document?

[code:1]
#Requires -Version 2
[CmdletBinding()]
Param (
[Parameter(Mandatory=$true)]
[String] $FilePath
)

$application = New-Object -ComObject excel.application
$application.Visible = $false
$document = $application.workbooks.open($FilePath)
$binding = \&quot;System.Reflection.BindingFlags\&quot; -as [type]
$properties = $document.BuiltInDocumentProperties
$hash = @{}

foreach($property in $properties) {
$hash += @{
[System.__ComObject].invokemember(\&quot;name\&quot;,$binding::GetProperty,$null,$property,$null) = &amp; {
try {
[System.__ComObject].invokemember(\&quot;value\&quot;,$binding::GetProperty,$null,$property,$null)
}
catch { 'N/A'}
}
}
}
$application.quit([Ref]([Microsoft.Office.Interop.Word.WdSaveOptions]::wdDoNotSaveChanges))

New-Object -TypeName PSObject -Property $hash
[/code:1]

Exemple de résultat sur un de mes fichiers pris au hasard :

[code:1]
PS &gt; .\Get-ExcelDocumentMetadata.ps1 -FilePath 'C:\Temp\Borne_arcade.xlsx'

Last author : PETITJEAN Arnaud
Category :
Content type :
Title :
Format :
Keywords :
Number of slides : N/A
Comments :
Security : 0
Number of characters (with spaces) : N/A
Manager :
Last print date : N/A
Number of characters : N/A
Application name : Microsoft Excel
Subject :
Language :
Author : PETITJEAN Arnaud
Number of notes : N/A
Creation date : 05/04/2016 15:43:51
Document version :
Number of paragraphs : N/A
Total editing time : N/A
Number of multimedia clips : N/A
Template :
Company : POWERSHELL-SCRIPTING.COM
Hyperlink base :
Content status :
Last save time : 05/04/2016 16:48:57
Number of bytes : N/A
Revision number :
Number of lines : N/A
Number of pages : N/A
Number of words : N/A
Number of hidden Slides : N/A
[/code:1]

L'information que tu recherches se trouve dans la propriété \&quot;Last author\&quot;.

Ah oui j'ai oublié de te dire que pour que le script marche, il faut qu'Excel soit installé sur ta machine. En effet, le script se base sur les objets COM d'Office.

Arnaud<br><br>Message édité par: Arnaud, à: 4/09/17 16:49

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 6 ans 6 mois #24148 par Marc
Réponse de Marc sur le sujet Re:Dernier enregistrement par usename
Merci Arnaud,

c'est exactement ce que je ne voulais pas, être obligé d'ouvrir le document pour regarder ce qu'il y a à l'intérieur :pinch:

M'enfin s'il n'y a pas d'autre solution...
Je ferais avec.

Merci pour l'astuce !

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 6 ans 6 mois #24155 par Arnaud Petitjean
Eh oui, pas le choix malheureusement...

Au début, tout comme toi, j'ai pensé que c'était des attributs NTFS mais à bien y réfléchir on comprend vite que ce n'est pas le cas.

Cela dit qu'y a-t-il de gênant à ouvrir les fichiers pour lire les métadonnées ? Peut-être est-ce l'aspect performance qui te déranges ?

Arnaud

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 6 ans 6 mois #24162 par Marc
Réponse de Marc sur le sujet Re:Dernier enregistrement par usename
En effet les performance sont largement diminué.

Si l'on a que quelque documents à traiter on peut s'en contenter, par contre s'il y en a plusieurs dizaines, centaines voir milliers l'exécution peut devenir extrêmement longue.

Il faut aussi penser à d'autre chose:
- Ne pas tenir compte des différents messages que Excel peut renvoyer
- Fermer le document en cours avant d'en ouvrir un autre
- Contrôler la bonne fermeture du document
- Relancer l'instance d'Excel s'il elle venait à planter

Enfin que de la joie :laugh:

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.072 secondes
Propulsé par Kunena