Als Programmierer, habe ich mich mal mit dem Thema: "Entsperren von Dateien aus unbekannter Quelle" beschäftigt, da eine Installationsroutine von mir hierdurch beeinträchtigt wurde. Ich zeige euch erstmal die "herkömmlichen" Wege, und dann noch wie man das Problem mit Powershell lösen kann.

Entsperren von Dateien

Als ich mich am Anfang mit dem Thema beschäftigt habe bin ich auf folgende Lösungen gekommen, um solche Dateien automatisiert zu entsperren:

1) Batchdatei

Man schreibt eine Batchdatei, und setzt am Anfang eine spezielle Umgebungsvariable:

SEE_MASK_NOZONECHECKS=1

also sowas wie:

@echo off    
set SEE_MASK_NOZONECHECKS=1
call \\MY_UNC_DRIVE\installs\Just_another_setup.exe


weitere Aufrufe innerhalb dieses Skriptes sollten dann nicht mehr beeinträchtigt werden.

2) Streams

Sysinternals (von Microsoft) hat ein Tool namens "Streams" auf seiner Webseite, welches dieses Problem löst. Gedownloaded werden kann es hier:

https://docs.microsoft.com/en-us/sysinternals/downloads/streams

aber grundsätzlich lohnt es sich mal hier vorbeizuschauen:

http://www.sysinternals.com 

Streams meinedatei

Das Ergebnis sieht dann z.B: so aus:

streams v1.60 - Reveal NTFS alternate streams.
Copyright (C) 2005-2016 Mark Russinovich
Sysinternals - www.sysinternals.com

c:\Users\ich\meinedatei:
            :test:$DATA 4

Die Datei besitzt also einen Stream "test", indem 4 Bytes gespeichert sind.
Mit 

Streams -d meinedatei

ist dann der Spuk vorbei :-)

streams v1.60 - Reveal NTFS alternate streams.
Copyright (C) 2005-2016 Mark Russinovich
Sysinternals - www.sysinternals.com

c:\Users\ich\meinedatei:
   Deleted :test:$DATA

Aber Wiso Streams, was hat das mit der Sicherheitsnachricht zu tun? Dazu kommen wir noch später im Detail.

3) Registry

Dieser Weg, muss ich sagen ist wirklich etwas "dirty", da man hierfür die Sicherheitsstufe der Internetoptionen heruntersetzen muss.
Es geht genauer um die Internetzonen, davon gibt es folgende:

Name der Sicherheitszone Wert
lokal 0
lokales Intranet 1
Vertrauenswürdige Seiten 2
Internet 3
eingeschränkte Seiten 4

Diese lassen sich bearbeiten, indem man im Startmenü "Internetoptionen" eintippt, hier auf "Sicherheit" klickt.

Wenn man hier nun in der Zone "Internet", auf "Stufe anpassen" klickt, und ganz unten den ersten Punkt im Bereich "verschiedenes" auswählt (Anwendungen und unsichere Dateien starten). Kann man hier das Verhalten festlegen. Zum abschalten der Blockade also "deaktivieren" auswählen.

Das gleiche geht auch per Registry und Policy:

HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\3 

Wie oben in der Tabelle zu sehen, steht die "3" für "Internet". Hier gibt es einen Haufen mit zahlen kodierter Werte. der interessante ist "1806". Wenn er nicht existiert, muss man Ihn im Registryeditor als "Dword" anlegen. Man kann hier nun die oben genannten Einstellungen speichern:

Name Wert
Deaktivieren (abschalten) 0
Bestätigen (nachfragen)  1
Aktivieren (sperren) 3

 Um also das Feature abzuschalten, kann man eine Registry-Datei mit folgenden Inhalt importieren:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\3]
"1806"=dword:00000000

4) Policy

Im Policy-Editor, z.B. gpedit.msc

Nach "Benutzerkonfiguration -> Administrative Vorlagen -> Windows-Komponenten->Anlagen-Manager" gehen, auf der rechten Seite: 
"Zoneninformationen in Dateianlagen nicht beibehalten" aktivieren, und mit "OK" bestätigen.

Und auch hier wieder: Was haben den Dateianlagen und "Zoneninformationen" damit zu tun?

Ich verrate es nun in der nächsten Variante.

5) Manuell die Stufe ändern bzw. manuell Flag entfernen

Was steht denn nun in diesem Geheimnisvollen Stream, wie sieht er denn aus?
Dazu muss man erstmal wissen wie der Stream heißt. Eine Analyse mit "Streams" bringt hier schnell Klarheit, er heißt: "Zone.Identifier".

Zugreifen kann man ganz einfach mit:

notepad meinedatei:Zone.Identifier

Ja, für den der noch keine Streams kennt sieht das ertmal ungewohnt aus, da es normalerweise der Trenner für Laufwerke auf der Kommandozeile ist.
Bequem lässt sich das mit notepad betrachten, der von mir bevorzugt "notepad3" hat aber Probleme damit, also bin ich auf "Notepad++" (https://notepad-plus-plus.org/downloads/ ) ausgewichen. 

Hier mal der N++ Befehl und typische Inhalt:

"C:\Program Files\Notepad++\notepad++.exe" BMW.DE.csv:Zone.Identifier
[ZoneTransfer]
ZoneId=3
ReferrerUrl=https://finance.yahoo.com/quote/BMW.DE/history?p=BMW.DE
HostUrl=https://query1.finance.yahoo.com/v7/finance/download/BMW.DE?period1=1507582454&period2=1510264454&interval=1d&events=history

Man kann erkennen: Die Internetzone ist 3. Wenn man also den Stream einfach löscht und mit Notepad++ speichert, ist die Blockade aufgehoben. Eine "1" und "2" würde bei den meisten ebenso funktionieren. Man sieht hier auch den URL-Ursprung der Datei. Er dient Microsoft und den Virenscanner dazu die Vertrauenswürdigkeit der URL zu prüfen. 

Verarbeiten von Streams mit Powershell

Zu guter letzt noch ein kurzer Abriß, wie man mit Powershell die Streams recht bequem verwalten kann:

Finden von Streams:

get-item BMW.DE.csv -Stream *

Bring mir sowas wie:

PSPath        : Microsoft.PowerShell.Core\FileSystem::C:\Users\ich\downloads\BMW.DE.csv:Zone.Identifier
PSParentPath  : Microsoft.PowerShell.Core\FileSystem::C:\Users\ich\downloads
PSChildName   : BMW.DE.csv:Zone.Identifier
PSDrive       : C
PSProvider    : Microsoft.PowerShell.Core\FileSystem
PSIsContainer : False
FileName      : C:\Users\VoSs2o0o\downloads\BMW.DE.csv
Stream        : Zone.Identifier
Length        : 247

sieht schonmal gut aus.

Den Inhalt lesen

Get-Content BMW.DE.csv -Stream Zone.Identifier

Ausgabe:

[ZoneTransfer]
ZoneId=3
ReferrerUrl=https://finance.yahoo.com/quote/BMW.DE/history?p=BMW.DE
HostUrl=https://query1.finance.yahoo.com/v7/finance/download/BMW.DE?period1=1507582454&period2=1510264454&interval=1d&events=history&crumb=nPJ5JRuDMsF

Den Inhalt schreiben

Set-Content BMW.DE.csv -Stream Test -Value "Hallo Stream"

hier mache ich mal ein GetContent hinterher, da man bei SET nichts sieht.

Get-Content BMW.DE.csv -Stream Test
Hallo Stream

Den Stream löschen

Remove-Item BMW.DE.csv -Stream Test

ein anschließendes Get-Content bring eine Fehlermeldung, das der Stream nicht gefunden wurde.

Dateien Unblocken

Nun könnte man hier ein nettes Script schreiben, aber den Befehl gibt es schon:

help Unblock-File

NAME
    Unblock-File

SYNTAX
    Unblock-File [-Path] <string[]>  [<CommonParameters>]

    Unblock-File  [<CommonParameters>]


ALIASE
    Keine

Dennoch ein kleines Script zum unblocken, ich hänge es euch nochmal mit an.

$Path=$args[1]

function Unblock-File {
    param (
        [Parameter(ValueFromPipeline)]
        [string]$Path
    )

    $files = Get-ChildItem -Path $Path -Attributes !Directory
    foreach ($file in $files) {
        if($file.FullName -eq $PSCommandPath){
            continue
        }
        get-item $file.FullName -Stream Zone.Identifier -ErrorAction:SilentlyContinue 
        Remove-Item $file.FullName -Stream Zone.Identifier -ErrorAction:SilentlyContinue -Force
    }
}

Unblock-File $Path

Unblockfiles Script

Nachteile von ADS Streams

Also das die Geheimniskrämerei auch von Viren und Schadsoftware verwendet wird, das ist euch sicherlich schon aufgefallen. Hier aber noch zwei Dinge die Ihr immer im Kopf haben solltet:

Alternative Data Streams sind nur mit NTFS kompatibel. Kopiert Ihr die woanders hin, z.B. ein USB-Stick mit FATex, dann sind die Streams weg :-(

Und etwas woran man auch nicht denkt: Wenn man die Dateien packt, dann befinden sie sich ja auch in einem anderen "Dateisystem", also sind sie normalerweise weg. Grundsätzlich kann man Sie aber erhalten. Bei meinem bevorzugten Packer "7-Zip" wäre das der Kommandozeilenparameter "-sns": https://sevenzip.osdn.jp/chm/cmdline/switches/sns.htm 

so long...


Keine Kommentare

Kommentar hinterlassen

Als Antwort auf Some User