tsukaito
Goto Top

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.
msip
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. face-sad
Hat jemand ein bessere Idee oder ein Script, wie ich an diese Properties komme?

Vielen Dank und schöne Grüße
Tsuakito

Content-Key: 3739040890

Url: https://administrator.de/contentid/3739040890

Printed on: July 24, 2024 at 11:07 o'clock

Member: Strods
Strods Jul 22, 2024 updated at 14:59:51 (UTC)
Goto Top
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
Member: tsukaito
tsukaito Jul 22, 2024 updated at 15:02:03 (UTC)
Goto Top
Hallo Strods,
korrekt, das sind ausschließlich Office-Dateien. Es könnten auch PDFs dazukommen, aber die ersten Anfragen waren jetzt nur Office-Dateien und ich möchte mir einen Überblick verschaffen, ob es 20 oder 2.000 Dateien sind. Nach der ermittelten Menge würde ich die Lösung designen.

Grüße
Tsukaito
Member: Strods
Strods Jul 22, 2024 updated at 16:01:49 (UTC)
Goto Top
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.
# 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
Member: tsukaito
tsukaito Jul 23, 2024 at 08:36:50 (UTC)
Goto Top
Hallo Strods,

die Idee ist richtig gut, aber leider funktioniert das entpacken nicht. Ich erhalte einen Error in Zeile 10. Wenn ich dem Fehler nachgehe, dann zeigt er, dass das Format kein ZIP-Format wäre oder die Datei beschädigt ist.
Ich habe dann versucht das Ganze auf "Expand-Archive" umzuschreiben, aber auch hier sagt er, dass nur ZIP das unterstützte Format wäre und entpackt die Datei nicht
Schade...die Idee war echt gut, außer Du hast noch einen Fix dafür...

Grüße
Tsuakito
Member: Strods
Strods Jul 23, 2024 updated at 09:22:28 (UTC)
Goto Top
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.

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.