Hohe Auflösungen jenseits von 2K auf kleinen Bildschirmen (z.B. Stichwort Retina bei Mac) können die Augen des Anwenders gerne mal in einen zugekniffenen Zustand versetzen. Ein zweischneidiges Schwert: Mehr Inhalt passt auf den Bildschirm, wird dafür aber wesentlich kleiner, wenn er nicht hochskaliert wird. Die Lösung dafür: DPI-Scaling oder bei Windows einfach nur „Skalierung“ in den Anzeige-Einstellungen.
Diese Oberflächenskalierung schafft einen positives aber doch diskutablen Effekt: Alle Elemente eines Programms (Icons, Schriften, Bilder, Buttons, usw.) werden vergrößert. Somit wird alles wieder lesbar, Oberflächen wieder erkennbar. Allerdings kann dabei die visuelle Qualität der Elemente leiden, wenn dieses nicht in höheren Auflösungen zur Verfügung steht – typisch für einfache Skalierung. Reiner Text wird gut skaliert, aber vor allem nicht-vektorbasierte Grafiken (oftmals auch für Buttons benutzt) können dann trotz hoher Auflösung pixelig angezeigt werden. Das fiel mir wieder in meinem vorherigen Blogbeitrag über den Freemake Video Converter auf. Das Programm hat die Skalierung nicht so gut verkraftet und wurde bei meiner Skalierung von 150% recht pixelig angezeigt:
DPI-Scaling für einzelne Anwendungen (de)aktivieren
Mit einer bestimmten Windows-Konfiguration ist es möglich, das DPI-Scaling für einzelne Programme zu aktivieren oder zu deaktivieren. Dadurch werden Programme bzw. bestimmte Elemente darin entweder größer (aber ggf. in schlechterer Qualität) oder kleiner (aber ggf. unlesbar/zu klein) angezeigt. Diese Einstellung ignoriert dann ebenfalls die globale „Skalierung“-Einstellung von Windows bzw. überschreibt sie. Beispiele für Programme, die mit einer angepassten DPI-Einstellung anders aussehen sind zum Beispiel Audacity, VLC oder das bereits erwähnte Freemake.
Schritt für Schritt:
Öffnet die Registry und geht zu Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide Schreibt hier ein neues DWORD namens „PreferExternalManifest“ und dem Wert 1.
Öffnet den Ordner des Programms, dessen Skalierungsverhalten ihr ändern wollt und sucht euch dort die ausführbare Datei, mit der das Programm gestartet wird.
Erstellt in diesem Ordner eine neue Datei mit dem Namen der ausführbaren Datei, aber mit „.manifest“ als Dateiendung. Also beispielsweise „audacity.exe.manifest“ oder „FreemakeVC.exe.manifest“.
Schreibt folgenden Inhalt in die .manifest-Datei und spielt mit dem True/False-Wert von <dpiAware>:
In den letzten Jahren ist im Betriebssystem von Microsoft echt viel passiert. Und trotzdem gibt es immernoch einen Uralt-„Hack“, den ich schon unter Windows 7 genutzt habe. Er ist so simpel wie damals, lässt sich genauso leicht ausführen und ermöglicht es, vom Login-Bildschirm aus beliebige Kommandozeilenbefehle mit System-Rechten auszuführen. Damit könnt ihr Passwörter bestehender Nutzer zurücksetzen, neue Nutzer erstellen, Dienste registrieren, quasi Kontrolle über das System erlangen. Schauen wir zuerst einmal, wie es funktioniert und später, wir ihr euch dagegen absichern könnt.
„Erleichterte Bedienung“ beim Übernehmen des Systems
Die Schwachstelle, die hier ausgenutzt wird, ist die Erleichterte Bedienung im Anmeldebildschirm von Windows. Seit Windows 7 gibt es dieses kleine Symbol hier, welches beim Klick eine Toolsammlung startet. So harmlos sie auch wirkt … und jetzt kommt’s … sie wird mit vollen Systemrechten gestartet! Nicht eingeschränkte Nutzerrechte, nicht Adminrechte, Systemrechte! Das ist natürlich super-kritisch bzw. in manchen Fällen super-praktisch und bis heute ausnutzbar.
Der Trick ist einfach: Windows startet beim Klick auf das Icon von „Erleichterte Bedienung“ das Programm [C:/]Windows/System32/Utilman.exe mit Systemrechten. Wenn wir nun diese ausführbare Datei mit einer in Utilman.exe umbenannten Kopie von cmd.exe überschreiben, ist der Trick schon fertig vorbereitet! Nun lässt sich Utilman.exe allerdings nicht ersetzen, während Windows läuft, daher müssen wir in eine Pre-Boot-Umgebung und das dort erledigen. Das geht nun via Windows Installationsmedium oder anderen beliebige Boot-Systeme.
Nun müsst ihr nur an dem PC sitzen und braucht ein Boot-Medium der Windows Version – Boot-DVD oder USB-Stick. Bootet in die Windows Installation und startet dort die Kommandozeile mit Shift+F10. Sucht euch nun in der CMD den Buchstaben eurer Systempartition, der wird womöglich nicht derselbe sein wie im Windows Normalzustand. Nutzt beispielsweise die Befehle „echo list volume | diskpart“ oder „wmic logicaldisk get deviceid, volumename“ für eine Auflistung aller Partitionen, dann solltet ihr den Namen eurer Systempartition wiederfinden.
Anschließend geht ihr in das Verzeichnis /Windows/System32 eurer Systempartition und macht es wie in den folgenden Screenshots: Verschiebt euch (nur als Backup) die originale Utilman.exe irgendwo hin und kopiert anschließend die cmd.exe mit dem neuen Namen Utilman.exe in dasselbe Verzeichnis. Nun ist eure Utilman.exe unter dem Schafspelz der Verborgenheit eigentlich eine cmd.exe.
Das war’s! … außer Windows Defender geht dazwischen
Nun gibt es noch eine kleine weitere Hürde, abhängig von eurem Betriebssystem und dessen Version. Denn fertig seid ihr jetzt erst mit Windows 7 und Windows 10 älter als Version 1809 (verfügbar seit spätestens März 2019). In Version 1809 hat Microsoft den Windows Defender verbessert und erkennt seitdem dieses Hintertürchen. In Windows würde euch der Defender nach dem Login (wenn ihr der Besitzer wärt) folgende Info bringen:
Nun lassen wir uns dadurch aber nicht die Suppe versalzen und setzen also in allen neueren Versionen noch einen Schritt drauf: Wir deaktivieren einfach Windows Defender und dann funktioniert der Hack wieder.
Win10 Version 1809+: Windows Defender deaktivieren
Es gibt zwei Wege, das zu bewerkstelligen: Entweder drei Befehle abtippen oder via regedit GUI händisch erledigen.
Zeig mal die Codezeilen
:: 1) Diese Befehle einfach in eurer schon offenen CMD ausführen
:: 2) Achtet beim folgenden Befehl auf den richtigen Buchstaben eurer Systempartition!
reg load HKLM\tmp C:\windows\system32\config\SOFTWARE
reg add "HKLM\tmp\Policies\Microsoft\Windows Defender" /v DisableAntiSpyware /t REG_DWORD /d 1 /f
reg unload HKLM\tmp
Alternativ: Händisch: Startet über die sowieso schon offene CMD regedit. Klick HKEY_USERS an, Datei -> Struktur laden… -> /Windows/System32/config/SOFTWARE laden -> darin Policies/Microsoft/Windows Defender suchen -> DWORD 32 „DisableAntiSpyware“ mit Wert 1 erstellen
Ladet euch die Config Struktur in HKEY_USERS…
… und erstellt einen Key an der richtigen Stelle.
Erleichterter Vollzugriff
Erledigt! Schließt das Setup, startet die Kiste neu und klickt im Login auf das „Erleichterte Bedienung“ Icon. Nun sollte sich eine CMD öffnen und eröffnet euch breite Möglichkeiten. Sollten sich die originalen „Erleichterte Bedienung“ Tools öffnen, ist beim Ersetzen der Utilman.exe etwas schiefgelaufen. Sollte gar nichts passieren, handelt es sich womöglich um ein Windows 10 neuer als Version 1809 und der Defender ist nicht erfolgreich deaktiviert und blockt die CMD-Ausführung. Ansonsten, wenn alles geklappt hat, sieht ihr dieses Resultat:
Passwort zurücksetzen dank CMD mit Systemrechten in Windows 10 mit Defender Bypass
Passwort zurücksetzen in Windows 7
Nun könnt ihr mit net user [existierender Nutzer] [neues Passwort] das Passwort zurücksetzen oder mit folgenden Befehlen einen neuen administrativen Nutzer erstellen:
net user [Nutzername] [Passwort]
net localgroup "Administrators" [Nutzername] /add
Disclaimer
Ein paar Anmerkungen hinten dran: Die Anleitung dient natürlich einzig eurer Fortbildung und Information – verschafft euch damit nicht unerlaubten oder ungewollten Zugriff auf fremde Systeme. Ich spreche außerdem „fälschlicherweise“ die ganze Zeit von „Hacks“ – hierbei handelt es sich aber nicht unbedingt um einen Hack, aus zwei Gründen: 1) Diese Manipulation ist Microsoft schon seit jeher bekannt und wird aber aus Gründen hingenommen und nicht stärker verhindert. Googlt für mehr Infos. 2) Physischer Zugriff auf den Zielrechner zu haben ist quasi Schummeln 😉
Law #2: If a bad guy can alter the operating system on your computer, it’s not your computer anymore. Law #3: If a bad guy has unrestricted physical access to your computer, it’s not your computer anymore.
Dazu erkunden wir Excel Formeln, teilweise kombiniert mit VBA Workbook_BeforeSave und teilweise das informationsreiche Objekt BuiltinDocumentProperties. Letzteres lässt sich mit VBA auslesen und auch in Zellen schreiben, später mehr dazu.
Zeitpunkt der letzten Änderung
Wir beginnen mal klassisch mit dem Zeitpunkt der letzten Änderung des Dokuments, also jede Form von Zelländerung beispielsweise. Hierfür nutzen wir =NOW() bzw. =JETZT() (englisches oder deutsches Excel) direkt in einer Zelle als Formel. Die „Berechnung“ des aktuellen Zeitpunkts/Zelleninhalts wird bei jeder Veränderung des Dokuments ausgeführt und ist somit immer auf dem Stand der letzten Änderung.
Zeitpunkt der letzten Speicherung (Now() oder BuiltinDocumentProperties)
Ähnlich funktioniert das für den Zeitpunkt der letzten Speicherung. Auch hier benutzen wir NOW() bzw. JETZT(), kombinieren das aber mit etwas VBA-Code. Denn dank Workbook_BeforeSave schreiben wir diesen Zeitwert immer nur zum Zeitpunkt des Speicherns in eine Zelle. Somit steht dort natürlich immer der letzte Speicherzeitpunkt drin. Gleichermaßen liefert das VBA BuiltinDocumentProperties(„Last save time“)dieselbe Information.
Wie funktioniert das mit dem VBA? Öffnet mit ALT + F11 in Excel den Code-Editor, Doppelklick auf Diese Arbeitsmappe (This Workbook) und fügt dann den Code dort ein. Ich schreibe mittels Sheets(„ID/Name“).Range(„Zelle“) in eine Zelle. In diesem Beispiel schreib ich also den Zeitpunkt der letzten Speicherung auf unterschiedliche Art und Weise in drei verschiedene Arbeitsblätter.
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, _
Cancel As Boolean)
' Letzter Speicherzeitpunkt mittels Now() oder BuiltinDocumentProperties:
Sheets("Blatt1").Range("B1").Value = Format(Now(), "dd.mm.yyyy hh:mm")
Sheets(2).Range("B1").Value = Format(Now(), "dd.mm.yyyy hh:mm")
Sheets(3).Range("B2").Value = ThisWorkbook.BuiltinDocumentProperties("Last save time")
End Sub
Einfaches Setup für den Zeitpunkt der letzten Speicherung mittels VBA Workbook_BeforeSave()
Wenn ich den Zeitpunkt der letzten Speicherung in allen Arbeitsblättern des Excel-Dokuments immer an derselben Stelle schreiben möchte, geht das folgendermaßen sehr schön kurz:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, _
Cancel As Boolean)
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
With ws
.Range("B1").Value = ThisWorkbook.BuiltinDocumentProperties("Last save time")
End With
Next ws
End Sub
Alle Eigenschaften der BuiltinDocumentProperties
In den BuiltinDocumentProperties steckt natürlich mehr drin als nur die „Last save time“. Ihr könnt euch alle Eigenschaften mit folgendem Code in ein Arbeitsblatt mit dem Namen documentproperties schreiben lassen:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, _
Cancel As Boolean)
On Error Resume Next
Sheets("documentproperties").Range("A1:B50").ClearContents
Dim r As Integer
r = 1
For Each prop In ThisWorkbook.BuiltinDocumentProperties
Sheets("documentproperties").Range("A" & r).Value = prop.Name
Sheets("documentproperties").Range("B" & r).Value = prop.Value
r = r + 1
Next
End Sub
34 teils hilfreiche Informationen stehen im BuiltinDocumentProperties Objekt„Das Gelernte anwenden“ nochmal etwas visualisiert 😉
Googles Software Reporter Tool, kurz SwReporter, ist schon ein mysteriöses Stück Software. Es ist nicht so leicht, irgendwelche Infos über Sinn, Zweck und Funktionsweise des Programms herauszufinden. Was auch daran liegt, dass das Tool eine Erweiterung des Chrome Cleanup Tools (CCT) ist. Das ist wiederum bekannter. Ich fasse mal meine Recherche zusammen, darunter noch ein paar Links für Interessierte.
Was ist der Software Reporter?
Der Software Reporter als Bestandteil des Chrome Cleanup Tools (CCT) wird mit Chrome installiert, befindet sich in einem Chrome Unterordner, wird dort auch regelmäßig aktualisiert und seine Aktivität kann nicht beeinflust oder deaktiviert werden. Das Programm wird in regelmäßigen Abständen (angeblich wöchentlich) automatisch unsichtbar im Hintergrund ausgeführt und ist dann für einige Minuten (angeblich +- 15 Minuten) mit niedriger CPU-Auslastung (als normaler Hintergrundprozess) am Arbeiten. Das Tool soll angeblich nur Teile des Systems durchsuchen, die mit Chrome zusammenhängen und dort sowohl nach inkompatibler Software als auch Schadware scannen. Gemeint sind auch schädliche Extensions, Suchanbieter, Downloads und mehr. Metadaten von Funden werden an Google geschickt.
Mit dem nötigen Grundwissen kann nun jeder selbst entscheiden, ob das Tool eine erwünschte oder unerwünschte Aufgabe erfüllt und ob das Beeinträchtigung-Nutzen-Verhältnis positiv ausfällt. Für alle, die den Software Reporter deaktivieren möchte, erläutere ich nun, wie das geht:
Wie deaktiviere ich den Software Reporter?
Grundlegend ist es recht einfach: Wir entziehen dem gesamten System, inklusive Chrome also, die Berechtigung, das Programm auszuführen, zu aktualisieren oder neu einzurichten. Öffnet den Pfad, in dem der Software Reporter liegt: C:\Users\[Nutzername]\AppData\Local\Google\Chrome\User Data\SwReporter\ und löscht alle Unterordner (vermutlich zwei), die quasi nur Versionsnummern als Ordnernamen haben.
Rechtsklick auf den Ordner SwReporter -> Eigenschaften
Öffnet den Sicherheit Tab
und klickt darin auf Erweitert.
Prüft, dass ihr selbst der Besitzer des Ordners seid. Das sollte der Fall sein. Wenn nicht, setzt euren Nutzeraccount über „Ändern“ als Besitzer.
Klickt auf Vererbung deaktivieren und wandelt mit der ersten Option im folgenden Popup diese in explizite Berechtigungen um.
In den Eigenschaften des Ordners wird zuerst die Vererbung der Berechtigungen aufgehoben
Berechtigungseinschränkungen clever wählen!
So gut wie alle Quellen im Netz nutzen diese Strategie. ABER sie machen auch alle denselben Fehler, denn sie entziehen die Berechtigungen unnötigerweise zu restriktiv, löschen beispielsweise alle Berechtigungen komplett. Nun darf man aber selbst den Ordner nicht mehr betreten, sonst werden die Berechtigungen wieder gesetzt und Chrome kann den Software Reporter wieder aktivieren. Wir achten aber darauf, dass wir selbst nicht komplett handlungsunfähig sind und den ehemaligen Problemherd im Auge behalten können.
Wir wählen jeden der drei Nutzer in der Liste nacheinander aus und führen jeweils die folgenden Schritte aus:
Bearbeiten klicken, um die Rechtebearbeitung zu öffnen
und mit Klick auf „Erweiterte Berechtigungen anzeigen“ die erweiterten Optionen anzeigen.
Nun übernehmt ihr die Einstellungen des folgenden Screenshots: Es werden die Schreibrechte auf Dateien, Ordner und Attribute entfernt, Lese- und Schreibberechtigungen der Berechtigungen und das Auflisten des Ordners weiterhin erlaubt. Da Chrome aber für die Verwaltung des Software Reporters keine Berechtigungen setzen kann, ist es hiermit machtlos. Der Vorteil: Dadurch, dass die Auflistung des Ordnerinhalts noch erlaubt ist, können wir den Ordner immernoch betreten.
Nun werden die Berechtigungen des Ordners clever gesetzt, sodass man sich selbst nicht komplett aussperrt
Vertrauen ist gut, Kontrolle ist besser
Nun hat Chrome keine Schreibberechtigungen mehr auf diesen Ordner, Dateien ausführen kann es auch nicht mehr (da wir vorher das Tool aus dem Ordner gelöscht haben, ist es eh nicht mehr drin) und ist somit ausgesperrt. Der Vorteil: Wir selbst können noch in den Ordner gucken und somit überprüfen, dass Chrome hier tatsächlich keine Ordner oder Dateien mehr anlegt, das kann man ja hin und wieder mal prüfen. Hätten wir alle Berechtigungen komplett entfernt, könnten bzw. dürften wir den Ordner selbst nicht mehr betreten und wären somit blind in der Hoffnung, dass Chrome darin nichts mehr macht.
Der Ordner kann noch betreten werden, jegliche Schreibaktionen sind jedoch geblockt.
Ich habe außerdem die Erfahrung mit anderen Programmen gemacht, dass sie gerne Fehler schmeißen und nicht mehr funktionieren, wenn man ihnen einfach komplett alle Berechtigungen auf Programmdateien oder -Ordner wegnimmt, da der Code versucht darauf zuzugreifen und sie gar nicht mehr findet. Wenn man nur Ausführung und Schreibrechte entfernt, sind die Auswirkung auf die Funktionsweise meist nicht so erheblich und teilweise ist dann wirklich nur die unerwünschte Funktionalität deaktiviert.
Kürzlich fragte mich Blogbesucher Sebastian nach Hilfe: Mittels Batch-Skript sollen innerhalb eines Ordners, in einer bestimmten Unterordnertiefe, bestimmte Ordner umbenannt werden. In dem Artikel des Kommentars hatte ich Hilfestellung gegeben, bestimmte Aktionen auf alle Unterordner eines Ordners auszuführen. Die Einschränkung, diese Aktionen nur auf ein bestimmten Level von Unterordnern auszuführen, gab es nicht. Schauen wir uns das mal an.
Auslesen von tiefen Ordnerstrukturen
Die Grundstruktur bleibt erstmal gleich: Mit for /d in ([order]\*) do () werden Befehle auf alle Unterordner eines Ordners ausgeführt. Mit dem zusätzlichen Parameter /r durchsuchen wir rekursiv tiefe Ordnerstrukturen und ignorieren sogar Dateien für mehr Performance.
Mit for /d /r tiefe Ordnerstrukturen durchlaufen und ausgeben
Der Befehl wird dann leicht umgebaut: for /d /r "[ordner]" %%i in (*) do () Dann noch etwas Ausgabe mit dazu und wir haben fast den tree Befehl nachgebaut 😉
@echo off
setlocal enableDelayedExpansion
for /d /r "%cd%" %%i in (*) do (
echo %%i
)
pause
endlocal
Erkennung der Tiefe des aktuellen Ordners
Jetzt brauchen wir eine Erkennung der Tiefe. Das hat mich etwas länger beschäftigt als gedacht. An die Tiefe der Rekursion von for /d /r scheint man leider nicht zu kommen und mehrere nicht-rekursive for-Schleifen ineinanderschachteln ist zu unflexibel. Stattdessen war folgender späterer Gedanke attraktiv einfach: Die Backslashes im Ordnerpfad zählen und damit die Tiefe erkennen. Etwas sehr simpel aber das einzige, das ich erfolgreich umsetzen konnte. Wer hier einen besseren Ansatz hat, gerne ein Kommentar hinterlassen.
Das Zählen von Zeichen in einem String ist in Batch leider kein Einzeiler, aber das Rad muss ja nicht neu erfunden werden. Hier hat schonmal jemand eine Funktion dafür geschrieben. Möglich wäre auch die Nutzung von Powershell mit dem [string].split() Befehl, jedoch ist die Nutzung von Powershell in Batch ein Fass, dass wir hier jetzt nicht öffnen.
Nun zählen wir für jeden Unterordner die Backslashes, subtrahieren die Anzahl der Backslashes des Ordners, in dem das Skript ausgeführt wird und erhalten damit die relative Tiefe zum Skriptordner.
@echo off
setlocal enableDelayedExpansion
set startdir=%cd%
call :GetCharCount startLevel %startdir% \
for /d /r "%cd%" %%i in (*) do (
echo %%i
call :GetCharCount level %%i \
echo absolute Tiefe: !level!
set /a relLevel=!level!-!startLevel!
echo relative Tiefe: !relLevel!
)
pause
endlocal
:GetCharCount
set _S=%~2
set /a %~1 = 0
for /L %%i in (0,1,10000) do (
if "!_S:~%%i,1!"=="" (set "_S=" & exit /b)
if /i "!_S:~%%i,1!"=="%~3" set /a %~1 += 1
)
set "_S="
exit /b
Absolute und relative Tiefe zum Skriptordner errechnen und ausgeben.
Verarbeitung von Ordnern in Abhängigkeit von Bedingungen
So, nun kann die Logik in Abhängigkeit von der Tiefe und weiteren gewünschten Faktoren mit ifs verbaut werden. Alle Ordner in der Tiefe X UND mit dem Ordnernamen Y sollen umbenannt werden? Ich habe das beispielhaft (mit viel debug output) mal umgesetzt:
@echo off
setlocal enableDelayedExpansion
set startdir=%cd%
set renameFrom=BitteUmbenennen
set renameTo=NeuerOrdnername
call :GetCharCount startLevel %startdir% \
for /d /r "%cd%" %%i in (*) do (
echo ----
echo %%i
call :GetCharCount curLevel %%i \
set /a relLevel=!curLevel!-!startLevel!
for %%J in (%%i) do set foldername=%%~nxJ
echo absolute Tiefe: !curLevel!
echo relative Tiefe: !relLevel!
echo Ordnername: !foldername!
if !relLevel!==3 if "!foldername!"=="!renameFrom!" (
echo **** RENAME ****
set oldPath=%%i
set newPath=!oldPath:%renameFrom%=%renameTo%!
echo !newPath!
move !oldPath! !newPath!
echo ****
)
)
pause
endlocal
:GetCharCount
set _S=%~2
set /a %~1 = 0
for /L %%i in (0,1,10000) do (
if "!_S:~%%i,1!"=="" (set "_S=" & exit /b)
if /i "!_S:~%%i,1!"=="%~3" set /a %~1 += 1
)
set "_S="
exit /b
Tiefe Ordnerstrukturen werden durchsucht und (beispielhaft) abhängig von der Tiefe und dem Ordnernamen umbenannt
Das ist jetzt natürlich beliebig erweiterbar aber das Prinzip sollte klar werden. Mehrere Voraussetzungen können einfach durch aneinanderreihen von ifs geprüft werden, quasi eine Einzeiler-Verschachtelung. Den aktuellen Ordnernamen ziehen wir mittels for-Befehl raus. Den neuen Ordnernamen bauen wir dank Batch String Manipulation. Das wäre in Powershell vermutlich ein Fünfzeiler aber sowas sieht in Batch irgendwie immernoch „schön“ aus 😉
Finale Version mit mehr Funktionen
Ich habe es vielleicht etwas übertrieben aber ich finde es immernoch interessant und unterhaltsam, in Batch zu coden, auch wenn es super umständlich ist und mit jeder Programmiersprache vermutlich einfacher wäre. Die finale Version beinhaltet weitere Möglichkeiten:
Steuerung des Tools mittels Parameter statt fest in den Code eingetragene Variablen – somit ließe sich das Ganze auch in eine .exe verwandeln und flexibel einsetzen. Optionale Modi (siehe unten), Ordnertiefe, Ziel und beliebig viele Quellordner könnt ihr beim Aufruf mit übergeben. Wenn das Programm ohne Parameter gestartet wird, wird eine Hilfe zur Nutzung ausgegeben.
Die Angabe mehrerer Quellordnernamen, die in einem Zielordner vereint werden sollen – die Dateien aller dieser Ordner werden im Zielordner derselben Ebene gesammelt.
Test-Modus zum Ausprobieren der Einstellungen. Im Testmodus geschieht alles so wie im Normaldurchlauf, nur dass die tatsächliche Datenverarbeitung übersprungen wird. Eine Ausgabe, wo sonst eine Dateiaktion passiert wäre, gibt es trotzdem.
Verbose- und Silent-Modus für viel oder wenig Ausgaben während der Abarbeitung. Im Silent-Modus gibt es nur 1 Ausgabe je Ordner, der umbenannt wird. Im Verbose Modus habt ihr viel zu Scrollen! 😉
Der Quelltext hier hier einsehbar: Code anzeigen
@ECHO off
SETlocal enableDelayedExpansion
REM Author: Hannes Schurig
REM Date: 02.09.2019
REM More: https://it-stack.de/05/08/2019/tiefe-ordnerstrukturen-untersuchen-und-verarbeiten-mit-batch-2019
SET startdir=%cd%
IF "%1"=="" (
ECHO ## USAGE ##
ECHO.
ECHO thistool.bat [--test] [--verbose] [depth] [renameTo] [renameFrom]
ECHO test [optional]: Use "--test" to run in test mode. Normal outputs but no rename will actually be triggered.
ECHO verbose [optional]: Use "--verbose" to get lots of output, without this there will be just one output per rename done.
ECHO depth: In which folder level [relative to this tool] will rename do its work?
ECHO renameTo: Folder name to rename to.
ECHO renameFrom: As many folder names as you want that will get renamed. Foldernames with spaces in double quotes.
ECHO.
ECHO ## Exemplary ##
ECHO.
ECHO thistool.bar --test 3 newName "old Name 1" oldName2
ECHO would run this tool in test-mode [no renames will be done] and both folders "old Name 1" [without quotes]
ECHO and oldName2 in folder level 3 below this tools folder will trigger the rename process.
ECHO thistool.bat --verbose 4 "new folder" "old Name" anotherFolder
ECHO This will actually rename anotherFolder and "old Name" to "new folder" [both without quotes] in 4-level-deep subfolders
ECHO and output lots of stuff.
PAUSE
ENDLOCAL
EXIT /B
)
:OptionalParams
REM number detection from: https://stackoverflow.com/a/17585404
ECHO(%~1|findstr "^[-][1-9][0-9]*$ ^[1-9][0-9]*$ ^0$">nul && GOTO :RequiredParams
IF "%1"=="--test" SET test=test&&SHIFT
IF "%1"=="--verbose" SET verbose=verbose&&SHIFT
GOTO :OptionalParams
:RequiredParams
SET depth=%1
SHIFT
SET renameTo=%1
SET "renameFrom=%*"
SET "renameFrom=!renameFrom:*%1 =!"
GOTO :LetsGo
:LetsGo
CALL :GetCharCount startLevel %startdir% \
IF "!verbose!"=="verbose" (
ECHO ##############################
ECHO verbose: !verbose!
ECHO test: !test!
ECHO depth: !depth!
ECHO renameTo: !renameTo!
ECHO renameFrom: %renameFrom%
ECHO startdir: !startdir!
ECHO level of startdir: !startlevel!
ECHO ##############################
)
pause
FOR /d /r "%cd%" %%A IN (*) DO (
CALL :GetCharCount curLevel "%%A" \
SET /a relLevel=!curLevel!-!startLevel!
FOR %%B IN ("%%A") DO SET "foldername=%%~nxB"
IF "!verbose!"=="verbose" (
ECHO ----
ECHO %%A
ECHO absolute Tiefe: !curLevel!
ECHO relative Tiefe: !relLevel!
ECHO Ordnername: !foldername!
)
IF !relLevel!==!depth! (
FOR %%C IN (%renameFrom%) DO (
SET tempRenameFrom=%%C
SET cleanFolderName=!tempRenameFrom:"=!
IF "!foldername!"=="!cleanFolderName!" (
CALL :RenameFolder %%C "%%A"
)
)
)
)
pause
endlocal
EXIT /B
:RenameFolder
SET renameFromActual=%~1
SET oldPath=%~2
SET cleanRenameTo=!renameTo:"=!
SET newPath=!oldPath:%renameFromActual%=%cleanRenameTo%!
IF "!verbose!"=="verbose" (
ECHO **** RENAME ****
ECHO From: !oldPath!
ECHO To: !newPath!
) ELSE (
ECHO *** Ordner !oldPath! wird umbenannt!
)
IF NOT "!test!"=="test" (
IF NOT EXIST "!newPath!" (
move "!oldPath!" "!newPath!">nul
) ELSE (
COPY /Y "!oldPath!" "!newPath!">nul
RD /S /Q "!oldPath!">nul
)
) ELSE (
ECHO Test-Modus aktiv, !oldPath! wird nicht umbenannt.
)
ECHO.
EXIT /B
:GetCharCount
SET _S=%~2
SET /a %~1 = 0
FOR /L %%i IN (0,1,10000) DO (
IF "!_S:~%%i,1!"=="" (SET "_S=" & exit /b)
IF /i "!_S:~%%i,1!"=="%~3" SET /a %~1 += 1
)
SET "_S="
EXIT /B
Nutzung des Skripts
Das Skript wird über Paramter beim Aufruf gesteuert:
rename.bat [--test] [--verbose] [depth] [renameTo] [renameFrom]
### Was machen die Parameter? ###
--test: Startet den Testmodus des Tools. Es läuft normal durch, gibt normale Ausgaben aber der Umbenennungs-Befehl wird nicht ausgeführt. Gut zum Testen.
--verbose: Mit dem --verbose Parameter werden viele hilfreiche Ausgaben während der Ausführung gemacht. Ohne diesen Parameter gibt das Tool ausschließlich 1 Zeile pro erfolgter Umbenennung aus, nicht mehr.
depth: In welcher Ordnertiefe werden die Ordner geprüft und umbenannt?
renameTo: Neuer Ordnername
renameFrom: Beliebig viele alte Ordnernamen, die umbenannt werden sollen
### Beispielhafte Aufrufe ###
rename.bat --test 3 NeuerName AlterName1 "Alter Name 2"
rename.bat --test --verbose 4 "Neuer Ordner" "Alter Ordner" Testordner
usw.
@Sebastian: Ich hoffe, deine Anfrage ist damit erfolgreich beantwortet und du kannst den Code so für deine Zwecke einsetzen. Sag Bescheid, wenn du noch Hilfe brauchst.
Nachdem ich in den zwei vorhergehenden Artikeln über HSTS, X-XSS-Protection und die Content-Security-Policy geschrieben habe, folgen nun die letzten kleineren HTTP Security Header. Dazu zählen unter anderem X-Content-Type-Options, X-Frame-Options, Feature-Policy und Referrer-Policy. Auf der Webseite von OWASP, dem Open Web Application Security Project, findet ihr auch eine gute Übersicht aller Header, Einstellungsmöglichkeiten und Best Practices. Wie in den letzten Artikeln beschreibe ich die Umsetzung der Header mit Apache via .htaccess-Datei.
X-Content-Type-Options
Der Header ist recht simpel, denn er hat nur 1 mögliche Option: „nosniff“. Mit dieser Eigenschaft verhindert der Header, dass der Browser einen übermittelten Content-Type MIME type ändert. Stattdessen muss der MIME-Type in jedem Fall befolgt werden, was MIME sniffing Attacken (auch „content sniffing“ genannt) verhindern kann. Bei diesem Angriffsszenario werden Dateien mit einem falschen MIME-Type an den Browser geschickt, welcher diese dann anders als vorgesehen interpretiert:
Header always set X-Content-Type-Options "nosniff"
X-Frame-Options
Die Angabe eines X-Frame-Options Header gibt vor, ob andere Seiten deine Seite einbinden können – als frame, iframe oder object. Verhindert werden dadurch vor allem Clickjacking Attacken. Damit steht dies im Gegensatz zur CSP, welche die Einbindung anderer Seiten in deine Seite behandelt. Drei Optionen stehen zur Auswahl: DENY, SAMEORIGIN und ALLOW-FROM [Domain]. Für WordPress ist es empfehlenswert, die Option SAMEORIGIN zu wählen, da es sonst Problemen geben wird, beispielsweise beim Update von Plugins.
Header always set X-Frame-Options "SAMEORIGIN"
Feature-Policy
Die Feature-Policy ermöglicht die Kontrolle vieler Browser-APIs und somit die Einschränkung der Angriffsquellen bei vielen Funktionen. Für jede Direktive (= API) können folgende Optionen gesetzt werden: * (alle Quellen erlaubt), self, none, [Domains]. Die Funktionalität ist also der CSP sehr ähnlich, aber mit Fokus auf Features. Auch wenn die Browserunterstützungnoch recht mau ist, empfehle ich die Nutzung: Beschränkt die einzelnen APIs so, wie sie in eurer Seite benötigt werden und schafft damit etwas mehr Sicherheit. Eine report-Direktive ist wohl schon in Arbeit, aber noch nicht implementiert, ich hoffe das kommt bald noch.
Ich aktiviere bei mir die Features autoplay, fullscreen und picture-in-picture für ’self‘, allesamt für embedded Videos brauchbar, der rest wird mit ’none‘ deaktiviert:
Ihr findet diese und weitere Einstellungen auch in den Webseiten-Einstellungen, die für jede Webseite angepasst werden können. Eure lokalen Settings stehen dabei noch vor den von der Seite vorgegebenen Featureeinstellungen:
Chrome’s Webseiten-Einstellungen für die Steuerung der Features
Referrer-Policy
Zuletzt noch die Referrer-Policy: Dieser Security Header steuert die Referrer-Information, die beim Aufruf eines Links auf eurer Seite mitgeschickt wird. Der Referrer ist dabei praktisch die Quelle der eingehenden Anfrage:
Grundsätzlich ist der Referrer eine nützliche Information, vor allem für Webseitenbetreiber und ihre Analysewerkzeuge wie Google Analytics. Sie erfahren, wie die Besucher auf die Webseite gekommen sind, von wo, eventuell mit welchen Suchbegriffen, und können ihre Seite mit diesen Informationen verbessern. Ich selber möchte hier also möglichst wenig restriktiv sein, aber dennoch die Sicherheit ein wenig erhöhen. Problematisch können Referrer-Informationen werden, wenn sie zu einer bösen oder unsicheren Seite weitergeleitet werden. Welche Möglichkeiten gibt es also?
Mögliche Optionen für die Referrer-Policy: no-referrer, no-referrer-when-downgrade, origin, origin-when-cross-origin, same-origin, strict-origin, strict-origin-when-cross-origin, unsafe-url
Ich möchte jetzt hier nicht auf jeden Punkt eingehen, das wäre unnötig. Informiert euch gerne bei Mozilla (mitsamt Beispielen) oder in diesem Blog zu den Auswirkungen jeder Eigenschaft auf den Referrer.
Ich benutze aus oben genannten Gründen nur die Option ‚no-referrer-when-downgrade‚. Diese ist möglichst locker beim Aufruf beliebiger http://-Links und schickt den gesamten Referrer da mit. Ich habe in meinem Blog keine kritischen Informationen, die nicht weitergeschickt werden sollten. Allerdings wird die Weiterleitung meines Referrers auf unsichere http://-Seiten verhindert, das erhöht die Sicherheit ein wenig. Überdenkt eure Seite, eure Links und wie ihr mit dem Referrer selbst umgehen wollt.
Achtung WordPress-Nutzer: Ich glaube seit WordPress 4.7 werden target=“_blank“ Links automatisch mit der Eigenschaft rel=“noreferrer noopener“ erstellt. Das mag gute Hintergrundgedanken haben, wenngleich auch die Seite informiert, dass noopener den Angriff verhindert und noreferrer nur als compatibility backup benutzt wird. Also unabhängig vom Referrer-Policy-Setting würdenLinks keinen Referrer mitsenden. Es gibt mindestens 2 verschiedene Codes für die functions.php, mit der sich das deaktivieren lässt, beispielsweise siehe Link in diesem Absatz. Das Problem hierbei: Beide Codes funktionieren nicht mit dem neuen Gutenberg-Editor. Ich habe hier bisher keinen Weg gefunden, das automatische noreferrer zu entfernen und daher bleibt dieser Security Header bei mir mehr oder minder Placebo und für alle Fälle.
Fazit
Das waren nun also die wichtigsten sieben HTTP Security Header in drei Artikeln, das war doch eine ganze Menge neues Wissen. Ich hoffe, dass ihr etwas Hilfe finden und eure Webseitensicherheit ebenfalls verbessern konntet. Es gibt noch weitere Security Header, diese waren dann aber entweder kaum verbreitet, kaum unterstützt oder kritisch diskutiert und mir daher zu edge case für meine Artikel.
Im Großen und Ganzen bin ich zufrieden, auch wenn man sicher immer noch besser und sicherer sein kann, hier mein securityheaders.com Ergebnis:
SecurityHeaders.com Ergebnis A nach den Header-Optimierungen
Das Installieren von .NET-Framework 3.5 war unter Windows 7 noch relativ einfach – Online- oder Offline-Installer herunterladen und los! Unter Windows 10 kann das unter Umständen mehr Probleme machen. Die Fehlercodes 0x800F081F und 0x800F0906 können die Installation bzw. Aktivierung sehr umständlich machen. „Aktivierung“, da das .NET-Framework 3.5 bereits in der Feature-Liste von Windows 10 („Windows-Features aktivieren oder deaktivieren“ im Startmenü) gelistet wird und eigentlich nur per Häkchen aktiviert werden muss. Windows 10 lädt das dann über Windows Update nach. Im besten Fall. Oder beim Nachladen der Installationsdaten von Windows Update erscheinen die besagten Fehlermeldungen.
Windows-Features in Windows 10 listen .NET-Framework 3.5 bereits
Nachladen der Installationsdateien von Windows Update…
… kann auch mal fehlschlage. Aber es gibt eine Lösung!
Die Installation erfolgt nun über ein Installationsmedium von Windows 10 – via USB oder ISO. Beides lässt sich binnen Sekunden über das Windows 10 Media Creation Tool herunterladen bzw. erstellen. Ich empfehle das ISO-Abbild, dieses lässt sich mit Rechtsklick -> Bereitstellen direkt in ein virtuelles Laufwerk verwandeln.
Nun braucht es für die Installation nur noch ein paar Befehle aus der administrativen CMD (als Admin starten!):