Custom File Properties auslesen
Hallo zusammen,
wir haben aktuell das Problem, dass wir von einer Domäne in eine andere umgezogen sind. Dabei ist der Klassiker die Fileserver-Migration. In der alten Domäne wan Microsoft Azure Protection als DRM aktiv. Jetzt haben wir nach der Migration immer wieder Dateien, welche das Flag noch haben. Im Windows-Explorer kann ich die Dateien identifizieren, da diese einen "Custom"-Reiter in den Optionen zeigen und hier MSIP-Labels zu sehen sind.
Ich möchte diese nicht entfernen sondern nur die Dateien finden, welche das Flag noch besitzen. Ich habe bereits versucht mit Powershell und VBS an diese "Custom Properties" zu kommen, aber finde keinen Weg. Wenn ich sie im Expleorer sehe, dann muss ich diese doch auch per Skript auslesen können?
Ich habe hier schon mit dem Module APIService und dem Standard ItemPropery mein Glück versucht. Im VBS habe ich einen Weg gefunden mir ein Application Object zu erstellen, welches dann die Datei öffnet und prüft ob die Labels vorhanden sind. Das dauert aber bei der Menge an Dateien unendlich lange.
Hat jemand ein bessere Idee oder ein Script, wie ich an diese Properties komme?
Vielen Dank und schöne Grüße
Tsuakito
wir haben aktuell das Problem, dass wir von einer Domäne in eine andere umgezogen sind. Dabei ist der Klassiker die Fileserver-Migration. In der alten Domäne wan Microsoft Azure Protection als DRM aktiv. Jetzt haben wir nach der Migration immer wieder Dateien, welche das Flag noch haben. Im Windows-Explorer kann ich die Dateien identifizieren, da diese einen "Custom"-Reiter in den Optionen zeigen und hier MSIP-Labels zu sehen sind.
Ich möchte diese nicht entfernen sondern nur die Dateien finden, welche das Flag noch besitzen. Ich habe bereits versucht mit Powershell und VBS an diese "Custom Properties" zu kommen, aber finde keinen Weg. Wenn ich sie im Expleorer sehe, dann muss ich diese doch auch per Skript auslesen können?
Ich habe hier schon mit dem Module APIService und dem Standard ItemPropery mein Glück versucht. Im VBS habe ich einen Weg gefunden mir ein Application Object zu erstellen, welches dann die Datei öffnet und prüft ob die Labels vorhanden sind. Das dauert aber bei der Menge an Dateien unendlich lange.
Hat jemand ein bessere Idee oder ein Script, wie ich an diese Properties komme?
Vielen Dank und schöne Grüße
Tsuakito
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 3739040890
Url: https://administrator.de/contentid/3739040890
Ausgedruckt am: 23.11.2024 um 12:11 Uhr
6 Kommentare
Neuester Kommentar
Hi.
Sind das ausschließlich Office-Dateien also *.docx *.xlsx usw.? Den Reiter zeigt Windows in der Regel nur an wenn es den Dokumenttyp erkennt oder eine spezielle Explorer-Erweiterung installiert ist wenn es sich um non Office Files handelt.
Gruß Strods
Sind das ausschließlich Office-Dateien also *.docx *.xlsx usw.? Den Reiter zeigt Windows in der Regel nur an wenn es den Dokumenttyp erkennt oder eine spezielle Explorer-Erweiterung installiert ist wenn es sich um non Office Files handelt.
Gruß Strods
Dann kannst du das aus den Office Files raus holen indem du sie als ZIP-Files behandelst, hier als Beispiel für *.docx und *.xlsx, geht aber genauso mit *.pptx, *.dotm, *.dotx, *.xlsm usw., einfach nur den Filter in der Get-ChidlItem Zeile anpassen.
Das geht wesentlich schneller als ein COM-Object zu erstellen da hier nur das entsprechende Custom Property XML File extrahiert und ausgewertet wird.
Gruß Strods
Das geht wesentlich schneller als ein COM-Object zu erstellen da hier nur das entsprechende Custom Property XML File extrahiert und ausgewertet wird.
# Quellordner
$folder = 'D:\archiv'
# ------------------------
Add-Type -AssemblyName System.IO.Compression
Add-Type -AssemblyName System.IO.Compression.Filesystem
$ErrorActionPreference = 'Stop'
# Dateien durchlaufen
$files = foreach($file in Get-ChildItem -LiteralPath $folder -File -Include *.xlsx,*.docx -Recurse){
# Datei als ZIP-File öffnen
$zipfile = [System.IO.Compression.ZipFile]::Open($file.Fullname,[System.IO.Compression.ZipArchiveMode]::Read)
# temporären Dateipfad im Temp-Verzeichnis erstellen
$tmp = join-path $env:TEMP ([IO.Path]::GetRandomFileName())
try{
# Extrahiere die "custom.xml" die die custom properties enthält
$zipfile.Entries | ?{$_.FullName -eq 'docProps/custom.xml'} | %{
# extrahiere das XML-File in eine temporäre Datei
[System.IO.Compression.ZipFileExtensions]::ExtractToFile($_,$tmp)
# suche nach den custom properties in der XML Datei die mit MSIP_* beginnen
if (Select-XML -LiteralPath $tmp -XPath "//ns:property[starts-with(@name,'MSIP_')]" -Namespace @{ns='http://schemas.openxmlformats.org/officeDocument/2006/custom-properties'}){
# gib die Datei zurück wenn mindestens eine Property gefunden wurde
$file
}
}
}finally{
# aufräumen
$zipfile.Dispose()
Remove-Item -LiteralPath $tmp -Force -EA SilentlyContinue
}
}
# Dateien ausgeben die MSIP Properties besitzen.
$files
Gruß Strods
Hier funktioniert das obige Skript einwandfrei mit über 200 Testfiles! Aber Achtung es werden mit dieser Methode nur die neuen OpenXML Formate unterstützt, nicht die alten binären Formate wie *.xls *.doc !! Denn die hatten intern noch keine ZIP-Struktur, die bekommst du nur über die COM Methode oder eine speziellen Parser ausgelesen.
Wenn das so alte Files sein sollten würde ich eh eine Konvertierung in die neuen Formate empfehlen.
Wenn das so alte Files sein sollten würde ich eh eine Konvertierung in die neuen Formate empfehlen.
Ich habe dann versucht das Ganze auf "Expand-Archive" umzuschreiben
Der Vorteil meiner Methode ist das man nicht alle Bestandteile der Datei extrahieren muss sondern man explizit nur die eine benötigte XML-Datei damit extrahiert, Expand-Archive extrahiert ja immer gleich alles und das ist bei größeren Files nicht gerade effizient.