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:
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
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...