Die administrative Proxmox-Website lässt sich per Letsecrypt-Zertifikat kostenlos per https absichern. Dafür hat Proxmox einen eingebauten ACME-Client, der Zertifikate bei Letsencrypt automatisch abruft bzw. erneuert. Die Validierung des DNS-Namens passiert dabei am einfachsten über eine Website, die von Proxmox automatisch angelegt wird und d...
Alle Gruppen eines Windows-User auf dem Client auflisten
Benutzergruppen definieren, auf welche Ressourcen ein Windows-Benutzerkonto Zugriff hat. Die Gruppenmitgliedschaften werden beim Anmelden eines Benutzers aufgelöst und im Security-Token des Startprozesses gespeichert. Man kann sich die Gruppenmitgliedschaften eines Benutzers z.B. mit dem Programm Process-Explorer aus den Sysinternals-Tools von Micr...
HedgeDoc: Kollaborative Markdown-Notizen für Trainings und Workshops
Echtzeit-Zusammenarbeit an Dokumenten muss nicht zwangsläufig über proprietäre Cloud-Dienste laufen. Wer Wert auf Datenschutz, Open Source und Markdown legt, findet in HedgeDoc (ehemals CodiMD) eine leistungsstarke Lösung.
Das Problem in Schulungen & Workshops
Wer technische Schulungen, Workshops oder Meetups leitet, kennt die typischen Reibungspunkte: Wo tauscht man während der Session schnell Code-Snippets, Links und Zwischenergebnisse aus? Proprietäre Cloud-Tools scheitern hier oft an Registrierungshürden, Firmen-Firewalls oder Datenschutzbedenken.
HedgeDoc schließt diese Lücke als schlanke, quelloffene Plattform für kollaborative Notizen in Echtzeit – komplett in Eigenregie betreibbar.
Die wichtigsten Features im Überblick
- Echtzeit-Kollaboration: Mehrere Personen arbeiten simultan am selben Dokument – inklusive synchroner Live-Vorschau.
- Zero-Onboarding für Teilnehmende: Über flexible Berechtigungsstufen (Frei editierbar, Nur Lesen oder Eingeloggte Nutzer) können Teilnehmende per Link sofort mitarbeiten – ganz ohne Account-Erstellung oder Software-Installation.
- Entwickler- & Admin-freundliche Werkzeuge:
- Syntax-Highlighting: Saubere Darstellung für praktisch jede Programmier- und Skriptsprache.
- Diagrams-as-Code: Architektur- und Ablaufdiagramme lassen sich via Mermaid oder PlantUML direkt im Dokument rendern.
- Formeln & Checklisten: Unterstützung für mathematische Ausdrücke (MathJax) und interaktive Aufgabenlisten.
- Vom Skript zur Präsentation: Mit einfachen Trennzeichen (
---) wandelt HedgeDoc das Dokument in interaktive Reveal.js-Slides um. Kursunterlagen und Präsentationsfolien stammen so aus einer einzigen Quelle. - Enterprise-Authentifizierung: Nahtlose Integration mit OAuth2, LDAP, SAML, GitHub oder über die lokale Benutzerverwaltung.
Self-Hosting: Volle Datenhoheit via Docker
Als Open-Source-Projekt (AGPLv3) lässt sich HedgeDoc schnell auf der eigenen Infrastruktur bereitstellen.
Hier ein produktionsnahes docker-compose.yml-Beispiel mit Healthcheck und persistenten Uploads:
Reveal.js: Schluss mit PowerPoint – Präsentationen als Code
Klassische Präsentationswerkzeuge wie PowerPoint oder Keynote stoßen in technischen Schulungen schnell an ihre Grenzen. Code-Snippets verlieren ihre Formatierung, Versionierung über Git ist mit Binärdateien ein Albtraum und das Layout zerschießt sich gerne auf fremden Rechnern. Die Lösung: Reveal.js, das quelloffene HTML-Präsentations-Framework.
Warum Reveal.js für Trainer & Entwickler unschlagbar ist
Reveal.js transformiert HTML- und Markdown-Dateien in interaktive, gestochen scharfe Präsentationen, die in jedem modernen Webbrowser laufen – plattformunabhängig und ohne proprietäre Software.
- Präsentationen im Git-Repository: Folien liegen als reine Textdateien (HTML oder Markdown) vor. Änderungen lassen sich mit
git diffnachvollziehen, branchweise pflegen und im Team kollaborativ weiterentwickeln. - Echtes Syntax-Highlighting: Code-Blöcke werden nicht als statische Screenshots eingebunden, sondern mit echten Themes, Zeilennummern und schrittweisem Zeilen-Highlighting (
highlight-lines) gerendert. - 2D-Navigation (Grid-Layout): Neben der horizontalen Hauptnavigation lassen sich vertikale Unterkapitel anlegen – ideal, um bei Fragen tiefer in Detailthemen einzutauchen, ohne den roten Faden zu verlieren.
- Integrierte Speaker-View: Ein Druck auf die Taste S öffnet eine vollwertige Referentenansicht mit aktuellen Folien, Vorschau auf die nächste Folie, Notizen und Präsentations-Timer.
- PDF-Export: Handouts lassen sich über die integrierte Druckfunktion direkt als saubere PDF-Dokumente exportieren.
Minimalbeispiel: Präsentieren mit reinem Markdown
Reveal.js erlaubt es, komplette Foliensätze ausschließlich in Markdown zu verfassen. Horizontale Folien werden mit --- und vertikale Detailfolien mit -- getrennt:
Outlook: Schnell mehrere Tage im Kalender anzeigen
"Sie wollen schnell mehrere Tage in Ihrem Outlook-Kalender nebeneinander vergleichen? So geht's! Klar, in Outlook gibt es eine Tages-, Wochen- und Monatsansicht. Aber nehmen wir an, sie wollen alle Donnerstage dieses Monats sehen? Oder von heute an drei Tage? Zunächst kann man im Datumsnavigator mit der Maus über mehrere Tage hinweg klicken und ziehen. Mit der gedrückten Strg-Taste gelingt es Ihnen auch, z.B. alle Donnerstage eines Monats anzuklicken. Damit können Sie beliebig viele Tage in der Kalenderansicht darstellen.
Eine weitere pfiffige Möglichkeit: Sie klicken den ersten Tag von den Tagen, die Sie sehen wollen an. Dann drücken Sie die Alt-Taste und eine Zahl. Schon werden Ihnen so viele Tage angezeigt, wie Sie eingetippt haben. So ergibt Alt+3 den ausgewählten Tag plus die zwei Folgetage, Alt + 0 zeigt insgesamt 10 Tage. Mehr geht mit diesem Tastentipp leider nicht. Aber dafür haben Sie ja die Maus..."
Datenbanken migrieren von mySQL zu SQL-Server
SQL-Server und mySql sind leider SQL-seitig nicht wirklich kompatibel. So gibt es zwar die Möglichkeit, eine Datenbank in mySQL als Script zu exportieren, aber leider kann man das Script auf dem SQL-Server nicht mehr für den Import benutzen. Der beste Weg für den Import führt daher über den SQL Server Migration Wizard. Der Migration Wizard steht für verschiedene Datenbanken zur Verfügung und hilft z.B. auch bei der Migration von Access-Datenbanken zu SQL-Server. Da das Tool recht komplex ist, möchte ich hier nur kurz zeigen, wie man eine einfach Migration durchführt, ohne auf die schmutzigen kleinen Details des Tools eingehen zu wollen. Ich verwende hierzu die derzeit aktuelle Version 6.0.1, 6.1 (für SQL-Server 2016) ist derzeit in der Beta-Phase.
Sie benötigen auf dem Rechner, auf dem Sie den SSMA einrichten wollen, zuerst einmal einen mySQL-ODBC-Treiber. Haben Sie die mySQL-Datenbank unter Windows auf dem gleichen Rechner installiert, dann müssen Sie nichts weiter machen, denn mySQL installiert den passenden ODBC-Treiber gleich mit. Ansonsten laden Sie den Treiber einfach bei mysql.com herunter. Nutzen Sie den 64-Bit Treiber, der SSMA wird nämlich auch in einer 64-Bit-Version installiert. Eine Konto für die Authentifizierung ist übrigens nicht notwendig, klicken Sie einfach auf den Link "No thanks, just start my download", wenn Sie nach Ihrem Login gefragt werden. Anschliessend installieren Sie den SSMA.
Wenn Sie den Migration Assistenten zum ersten Mal starten, müssen Sie ein Migrationsprojekt erstellen. Wählen Sie hierfür im Menü File "New Project" aus. Wichtig ist, dass Sie im folgenden Fenster das Migrationsziel auswählen. Standardmässig ist hier Azure angegeben. Leider können Sie das Ziel im Projekt selber dann nicht mehr ändern. Das kann ziemlich verwirrend sein!
Nun müssen Sie eine Verbindung zum Quell- und zum Zielsystem herstellen. Wählen Sie hierfür in der Toolbar zuerst "Connect to MySql". Wählen Sie im Verbindungsfenster den Provider aus - dies ist der ODBC-Treiber, den Sie installiert haben. Ist hier kein Treiber sichtbar, obwohl Sie einen Treiber installiert haben, dann prüfen Sie, ob Sie den Treiber und SSMA beide in der gleichen Version (32-Bit / 64-Bit) installiert bzw. gestartet haben. Außerdem benötigen Sie den Namen des Quellservers, den mySQL-Port (standardmässig 3306), sowie ein Konto mit Leserechten auf dem mySQL-System.
Nun verbinden Sie sich mit dem SQL-Server.
Vector Databases kompakt: Warum deine KI-Anwendung mehr braucht als ein normales DBMS
Klassische Datenbanken sind darauf optimiert, exakte Antworten zu liefern: „Finde User-ID 42“ oder „alle Einträge mit Status = aktiv“. KI-Anwendungen stellen jedoch eine andere Art von Frage: „Welche Inhalte sind inhaltlich ähnlich zu dieser Anfrage?“ Genau hier beginnt das Problem – und gleichzeitig die Stärke von Vector Databases.
Das Grundproblem: Warum klassische Suche bei KI versagt
Eine typische SQL-Suche wie LIKE '%Anfrage%' arbeitet rein auf Textebene. Sie erkennt keine Bedeutung, keine Synonyme und keinen Kontext. Eine Suche nach „Cloud Security“ wird nicht automatisch Inhalte zu „Zero Trust“ oder „IAM Hardening“ finden – obwohl sie thematisch eng verwandt sind.
KI-Systeme lösen dieses Problem über sogenannte Embeddings. Dabei wird ein Inhalt (Text, Bild oder Audio) in einen mathematischen Vektor umgewandelt – also eine Liste aus Zahlen, zum Beispiel 1536 Dimensionen.
Diese Zahlen sind keine Zufallswerte, sondern repräsentieren semantische Eigenschaften. Inhalte mit ähnlicher Bedeutung liegen im Vektorraum näher beieinander als völlig unterschiedliche Inhalte.
Das Problem: Um Ähnlichkeit zu bestimmen, müssen diese Vektoren miteinander verglichen werden. Bei großen Datenmengen (Millionen oder mehr) ist das mit klassischen Datenbanken extrem ineffizient.
Microsoft Entra Connect vs. Cloud Sync
Der direkte Vergleich & Entscheidungshilfe
Wer sein lokales Active Directory mit Microsoft Entra ID (ehemals Azure AD) verbindet, steht vor der Entscheidung zwischen zwei Tools: der klassischen Server-Anwendung Microsoft Entra Connect Sync und dem modernen, leichtgewichtigen Microsoft Entra Connect Cloud Sync.
Microsoft empfiehlt für Neuinstallationen ausdrücklich, Cloud Sync zu evaluieren. Das Ziel von Microsoft ist klar definiert: Cloud Sync soll die klassische On-Premises-Variante langfristig ablösen, sobald vollständige Funktionsparität erreicht ist. Doch wie sieht der aktuelle Stand aus und welches Tool ist für Ihr Szenario das richtige?
Das Architektur-Paradigma im Vergleich
Der grundlegende Unterschied liegt in der Verteilung der Rechenlast und der Steuerungslogik:
Entra Connect Sync (Klassisch):
Windows Profile Betriebssystemunabhängig mit UE-V
"Benutzerprofile verwalten - augenblicklich und Betriebssystemversionst-unabhängig - ist das möglich? Ja, mit UE-V!
UE-V (eine kurzform von Microsoft User Experience Virtualization) ist eine Funktion, um Windows Benutzerprofile zu verwalten. Vor kurzem haben wir darüber geschrieben, wie man servergespeicherte Benutzerprofile verwalten kann, wenn man 2 verschiedene Windows-Versionen unterstützen muß. Normalerweise muß man dafür 2 verschiedene Benutzerprofile hinterlegen und die entsprechenden Benutzerordner wie Desktop, Eigene Dateien usw. aus dem Benutzerprofil ""herausziehen"" und auf einer Netzwerkfreigabe speichern. Mit Windows UE-V wird das Benutzerprofil (die Benutzereinstellungen, nicht die Dateien, die ziehen wir weiterhin aus dem Profil heraus) über einen eigenen Dienst verwaltet. Der UE-V Dienst überwacht die Registry und den App-Folder im Benutzerprofil und synchronisiert Änderungen an Anwendungseinstellungen auf ein Netzwerklaufwerk (Share). Diese Änderungen werden nach dem Beenden der Anwendung direkt gespeichert, so dass ein Abmelden zum Synchronisieren der Benutzereinstellungen nicht mehr notwendig ist. Auch Modern Apps (Windows 8 Apps) werden mit UE-V 2.0 unterstützt. Out of the Box bringt UE-V die Unterstützung diverser Anwendungen mit. Für Anwendungen, die nicht von UE-V unterstützt werden, können eigene XML-Konfigurationsdateien mit Hilfe eines mitgelieferten Tools erstellt werden. Das tolle an UE-V ist, dass nicht alle Einstellungen zwischen den Clients eines Rechners synchronisiert werden. Dadurch kann man die Benutzerprofile auch zwischen unterschiedliche Betriebssytemen ohne Verrenkungen verwalten. So, wo ist jetzt der Nachteil des UE-V? Es ist nur als Bestandteil des Desktop Optimization Kits zu bekommen (M-DOP). Warum nur, Microsoft, warum? Verdient ihr mit dem MDOP tatsächlich so viel Geld, dass es sich lohnt, diese Programme nicht zum Bestandteil des Betriebssystems zu machen?"
Mit Powershell Reg_Binary Werte in die Registry schreiben
Wie Sie mit der Powershell Reg-Binary Werte in die Registry schreiben Powershell bietet ein mächtiges Kommando zum setzen von Registry-Werten: SET-ITEMPROPERTY bzw. NEW-ITEMPROPERTY. Mit Set können Sie einen bestehenden Wert überschreiben, mit New erzeugen Sie einen neuen Wert. Die Syntax ist grundstätzlich sehr simpel:
New-Itemproperty -Path "Registrierungsschlüssel" -name "Name des Werts" -Value "Zu setzender Wert" -PropertyType "Typ des Eintrags"
Als Propertytype kommen dabei in Frage:
- BINARY
- DWORD
- STIRNG
- EXPANDSTRING
- MULTISTRING
- QWORD
Die meisten der Werte sind einfach zu setzen, allerdings erweist sich Binary mitunter als widerspenstig. Wird als PropertyType "BINARY" angegeben, so muß der angegebene Wert sich auch im Binärdatentyp befinden. Eine Umwandlung kann dabei über die Konvertierungsfunktion [BINARY] erfolgen. Ein wenig trickreich wird es, wenn man Daten z.B. aus einem Regfile ausliest, weil beim Registrierungsepxort die Daten nicht als Binärdaten ausgegeben werden, sondern als HEX-Zahlen. Diese müssen vorher erst wieder ins Dezimalformat umgewandelt werden, bevor man sie ins Binärformat konvertieren kann. Eine mögliche Lösung sieht so aus:
New-ItemProperty -Path 'HKCU:\Software\' -name "EinWert" -Value (&{'c7,02,00,00'.split(",") | %{"0x"+$_}}) -PropertyType BINARY}Kurze Erklärung: Die Hex-Werte werden in einem Script-Block aufgesplittet und per String-Addition für Powershell in einen Hex-Wert gewandelt. Diesen kann Powershell dann implizit konvertieren. Weitere Informationen zur Konvertierung finden Sie in unserem vorigen Tipp.
Mit Powershell schneller Hashen
Powershell unterstützt mit dem Cmdlet Get-Filehash von Haus aus die Möglichkeit, Hashes über Dateien zu erzeugen. Ein Hash ist dabei eine komplexe Prüfsumme, die die Eindeutigkeit einer Datei garantiert - die Prüfsumme kann die Datei also identifizieren. Ein kryptographischer Hash-Algorithmus wie SHA-1 oder SHA-2 (gesprochen Schah oder mit den Einz...
Gruppenrichtlinien mit WMI-Filtern auf Windows 10 Feature Releases (Builds) filtern
Mehr zum Thema Gruppenrichtlinien finden Sie auch in meinem Buch Gruppenrichtlinien in Windows 10 und Windows Server 2019, das voraussichtlich im Oktober in der Neuauflage erscheint.
Warum WMI-Filter für Windows 10 Builds nutzen?
Jedes Windows 10 Feature-Release bringt neue Funktionen und neue Gruppenrichtlinien mit. Welche Richtlinien in welcher Version neu dazugekommen sind, können Sie im Group Policy Settings Reference-File nachschauen, das Microsoft zum Download anbietet.
Manche Richtlinien sind leider nicht wirklich kompatibel zueinander. Z.B. hat Microsoft mit dem Feature Release 1607 die Nutzungszeit eingeführt und auf 12 Stunden festgelegt. Ab 1703 sind es aber maximal 18 Stunden. Sie können die Nutzungszeit auch per Gruppenrichtlinie festlegen, aber die Maximalwerte von 1703 kann 1607 nicht verarbeiten. Die Lösung sind zwei Gruppenrlichtlinienobjekte (GPOs), die per WMI-Filter "Ihre" Version aussortieren.
Die richtige WQL-Abfrage für Windows 10 Feature Releases
Aber auf welchen Wert kann man filtern? Die offizielle Nummer des Feature-Release kann man per WMI-Filter nicht erfragen. Stattdessen kann man aber die Build-Nummer verwenden, die sich mit jedem Feature-Release ändert. Eine Liste der aktuellen Build-Nummern finden Sie bei Wikipedia unter https://en.wikipedia.org/wiki/Windows_10_version_history. In der ersten Tabelle finden Sie in der Spalte Builds die jeweilige Build-Nummer.
Aufbau der WMI-Klasse Win32_OperatingSystem
Per WMI ermitteln Sie die Build-Nummer über die Klasse Win32_OperatingSystem und die Eigenschaft BuildNumber.
Widerspenstige Azure Storage Accounts löschen - "There is currently a lease on the blob and no lease ID was specified in the request"
Neulich in Azure - Sie wollen einen Strorage-Account löschen, aber er will einfach nicht verschwinden, obwohl die GUI meldet, der Job sei erfolgreich abgeschlossen? Nach einer genauen Untersuchung stellen sie fest, dass das System folgende Fehlermeldung schmeißt: Error: There is currently a lease on the blob and no lease ID was specified in the request.
Das Problem besteht darin, dass sich in dem Storage-Account noch vhd-Dateien befinden, deren VMs inzwischen gelöscht sind, was an Azure aber irgendwie vorbei gegangen ist. In meinem Fall war die Ursache vermutlich, dass ich die Objekte einzeln über Powershell gelöscht habe statt über die Web-GUI. Jedenfalls hat Azure noch eine Verbindung zwischen der VM, die nicht mehr existiert, und der vhd gespeichert und sperrt deswegen die Löschung der Daten. Lösen lässt sich das Problem auch nicht mit den Azure Powershell Cmdlets und dem Parameter Force. Stattdessen hilft AzureCLI weiter, ein Kommandozeilentool zur Verwaltung von Azure. Eine Anleitung zur Installation finden Sie bei Microsoft.
Nachdem Sie AzureCLI installiert haben, starten Sie ein Konsole, Powershell oder cmd. Das Tool zur Verwaltung lautet einfach azure:
azure loginazure account set "Ihr Subscription-Name"azure config mode armazure storage account listazure storage account delete <Ihr Storage Account Name>
Azure config mode arm ist nur notwendig, wenn Ihr Account im Azure Resource Manager mode angelegt wurde. Ein sicheres Zeichen dafür, dass das nicht der Fall war ist, wenn Sie den account noch im alten Portal angelegt haben. Probieren Sie es einfach aus, wird Ihr Account ohne den Moduswechsel nicht angezeigt, geben Sie einfach azure config mode arm ein. Mit dem delete wird der Account sofort und ohne Meldung entfernt. Wie Mr. Spock sagen würde - faszinierend!
Relational vs. Document Store: Wann JSON in SQL-Datenbanken Sinn ergibt (und wann nicht)
In Zeiten von flexiblen APIs und modernen Web-Frameworks stehen Entwickler und Datenbank-Administratoren häufig vor der Grundsatzfrage: Nutzen wir für dynamische Datenstrukturen eine dedizierte Dokumentendatenbank (NoSQL) oder bleiben wir beim bewährten relationalen Schema?
Moderne relationale Datenbanksysteme bieten mit Datentypen wie JSON bzw. JSONB (z. B. PostgreSQL JSONB) längst eine Brücke zwischen beiden Welten. Doch die Verfügbarkeit dieser Features verleitet oft dazu, strukturierte Daten unüberlegt in JSON-Spalten zu "verklappen".
Wann ist der Einsatz von JSON in SQL-Datenbanken eine echte Bereicherung für die Architektur – und wann wird er zum Wartungs- und Performance-Albtraum?
Die Vorteile: Warum JSON in SQL ein mächtiges Werkzeug ist
Relationale Datenbanken punkten durch ACID-Garantien, Dateneinteilung über Schemata und mächtige Join-Operationen. Das Ergänzen von JSON-Spalten bringt entscheidende Vorteile in spezifischen Szenarien:
Veraltete Statistiken: Warum der Query Optimizer falsche Entscheidungen trifft (und wie Sie es beheben)
Das Navigationssystem Ihrer Datenbank
Stellen Sie sich vor, Sie nutzen ein Navigationssystem, dessen Kartenmaterial seit fünf Jahren nicht aktualisiert wurde. Das Navi führt Sie über verstopfte Landstraßen, weil es die neue Autobahn schlicht nicht kennt.
Genau das passiert im Herzen von PostgreSQL: Der Query Optimizer entscheidet bei jeder eingehenden SQL-Abfrage anhand von internen Statistiken (gespeichert in pg_statistic), welcher Ausführungsplan (Execution Plan) der schnellste ist. Sind diese Daten veraltet – etwa nach massiven Datenimporten, Löschaktionen oder Batch-Jobs –, schätzt der Optimizer die Anzahl der zu erwartenden Zeilen (Cardinality Estimation) völlig falsch ein.
Die Konsequenz: Die Datenbank wählt langsame Sequential Scans statt gezielter Index Scans oder entscheidet sich für falsche Join-Operatoren.
Live-Szenario in AdventureWorks
Nehmen wir an, wir arbeiten in der Tabelle sales.salesorderdetail. Wir simulieren einen massiven Datenimport (z. B. durch ein nächtliches ETL-Skript) und deaktivieren für die Demonstration das automatische Update der Statistiken.
Schritt 1: Ausgangslage prüfen
Wir suchen nach Auftragspositionen mit einer überdurchschnittlich hohen Bestellmenge (orderqty > 50).
Wann ein echter Document Store Sinn ergibt – und wann nicht
Relationale Datenbanken mit JSON- oder JSONB-Spalten sind für variable Zusatzattribute oft eine gute Lösung. Wenn jedoch der Großteil der Daten dynamisch ist, Dokumente tief verschachtelt sind und der Zugriff meist auf ganze Einheiten erfolgt, reicht dieses hybride Modell oft nicht mehr aus.
In solchen Fällen lohnt sich der Blick auf einen echten Document Store wie MongoDB, Couchbase oder Amazon DocumentDB.
Document-First als Prinzip
Document Stores organisieren Daten nicht in flachen Tabellen, sondern in semi-strukturierten Dokumenten, meist JSON oder BSON. Der Ansatz ist einfach: Was zusammen gelesen wird, wird oft auch zusammen gespeichert.
Das macht das Modell für viele Anwendungen sehr attraktiv. Ein Dokument entspricht häufig direkt dem Objekt im Anwendungscode, was die Entwicklung vereinfacht und aufwendige Joins oder O/R-Mapper reduziert. Gleichzeitig lassen sich neue Felder oft ohne langwierige Schema-Migrationen im Live-Betrieb ergänzen.
Windows Freigaben auf einen neuen Pfad migrieren mit Powershell
Wenn auf einem Dateiserver Ordner verschoben werden müssen, kann das Anpassen der Freigaben für darunterliegende Verzeichnisse sehr aufwändig sein — besonders bei vielen Home-Shares. Statt die GUI zu verwenden, lässt sich das schneller erledigen, indem die Registry-Einträge unter:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Sharesangepasst werden. Alternativ kannst du die folgende PowerShell-Funktion verwenden, die einen angegebenen Pfad im Registry-Schlüssel durch einen neuen ersetzt; da sie rein nach Muster ersetzt, lassen sich beliebige Teilpfade austauschen.
function Replace-SharePath { <# .SYNOPSIS Replace the Filesystem-Path of a Share .DESCRIPTION Replace-SharePath can change the Filesystem-Path of shares. This can be helpful if you need to move files to a new drive or have to move files to a subfolder and you have multiple shares to touch. The script will change the given string into the new string, so all shares under the given path will be affected. .EXAMPLE To move files from C:\Shares to D:\NewSharesFolder: Replace-SharePath -Path C:\Shares -NewPath D:\NewSharesFolder #> param( [ValidateScript({ if (!(Test-Path -Path $_ -PathType Container)) { throw "Bitte den Quellpfad prüfen!" }; $true })] [Parameter(Mandatory = $true)] $Path, [ValidateScript({ if (!(Test-Path -Path $_ -PathType Container)) { throw "Bitte den Quellpfad prüfen!" }; $true })] [Parameter(Mandatory = $true)] $NewPath ) $Path = $Path.Replace('\\', '\\\\') $NewPath = $NewPath.Replace('\\', '\\\\') $ShareList = Get-Item 'HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Shares' foreach ($Share in $ShareList.Property) { Get-ItemProperty -Path $ShareList.PSPath -Name $Share $newValue = (Get-ItemProperty -Path $ShareList.PSPath -Name $Share).$Share -replace "(^Path=)($Path)", "Path=$NewPath" Set-ItemProperty -Path $ShareList.PSPath -Name $Share -Value $newValue -PassThru }}Führen Sie die Funktion einmal aus und starten Sie sie anschließend über folgende Eingabe:
Replace-SharePath -Path 'C:\OldSharePath' -NewPath 'D:\NewSharePath'Damit lassen sich Windows-Freigaben relativ einfach migrieren.
Praxis-Tipp aus unserem Trainingscenter: Wollen Sie Ihre IT-Infrastruktur professionell automatisieren? Entdecken Sie unsere modularen Seminare für Einsteiger und Profis: PowerShell Schulung in Hannover.
Als Benutzer das Active Directory nach Druckern und Objekten durchsuchen
Wussten Sie, dass die Standardberechtigungen des AD jedem Benutzer den Zugriff auf alle Benutzer-, Gruppen- und Computerobjekte erlauben? Natürlich ist dieser Zugriff eingeschränkt - sensible Informationen sind weder einseh- noch änderbar. Nichtsdestotrotz kann diese Funktion sehr hilfreich sein, da es einem Benutzer so z.B. ermöglicht wird, nach e...
Programme und Code in Base64 und zurück konvertieren und ausführen mit Powershell
Base64 ist ein Format, das es erlaubt, Binärdaten als Text darzustellen. Den Zweck von Base64 habe ich bereits im Artikel Binärdateien einlesen und Base64-Codieren mit Powershell beschrieben. Eine sehr gute und ausführliche Beschreibung finden Sie außerdem bei Wikipedia.
Das Umwandeln von Binärdaten in Text ist im Powershell-Kontext aus mehreren Gründen spannend. Zum Einen kann man mit Base64 ausführbare Programme in einem Skript mitliefern, ohne sie als eigenständige Dateien mitliefern zu müssen. Zum Anderen kann Powershell Base64-kodierten Code direkt ausführen, indem man die Powershell.exe mit dem Parameter -encodedCommand aufruft.
Lesen Sie zuerst die Datei ein, die in Text umgewandelt werden soll. Hierfür verwenden Sie entweder das Powershell-Cmdlet Get-Content mit dem Parameter -Encoding Byte und -Raw, oder Sie benutzen die Powershell-Klasse [IO.File]:
$BinaryData = Get-Content -Path C:\Tools\Drivesnapshot64.exe -Encoding Byte -Raw
# Alternativ:
$BinaryData = [IO.File]::ReadAllBytes('C:\Tools\Drivesnapshot64.exe')
Der Parameter -Raw sorgt dafür, dass die Datei komplett und nicht zeilenweise eingelesen wird, -Encoding Byte sagt Powershell, dass es sich um eine Binärdatei handelt.
Die Konvertierung findet mit der [Convert]-Klasse aus dem .Net-Framework statt. Die Methode ToBase64string() wandlet die Binärdaten in Text um:
Binärdateien einlesen und Base64-Codieren mit Powershell
Grundsätzlich unterscheidet man zwischen Textdateien und Binärdateien. Technisch gesehen sind beide Dateitypen Bitströme, also Reihen von aufeinanderfolgenden Bits. Textdaten werden allerdings nach einem festen Muster kodiert. Jeweils ein Block von 8 oder 16 Bits (oder je nach Codierung auch mehr) werden zu einem Zeichen zusammengefasst. Die klassische Codierung ist dabei die sehr alte ASCII-Codierung, die ein Zeichen in jeweils 7 Bit codiert und insgesamt 8 Bit für die Speicherung verwendet. Wenn man Get-Content verwendet, um eine Textdatei einzulesen, versucht Get-Content automatisch, die Datei als Text zu interpretieren und darzustellen.
get-content -Path $einv:Windir\lsasetup.log
[ 1 1 / 4 1 5 : 3 1 : 1 4 ] 5 9 6 . 6 0 0 > - I n L s a p S e t R a n d o m D o m a i n S i d ( )
[ 1 1 / 4 1 5 : 3 1 : 1 4 ] 5 9 6 . 6 0 0 > - L s a p G e n e r a t e R a n d o m D o m a i n S i d : R t l A l l o c a t e A n d I n i t i a l i z e S i d r e t u r n e d 0 x 0
Die Ausgabe dieses Beispiels sieht allerdings sehr merkwürdig aus - Powershell hat zwischen jedes Zeichen ein Leerzeichen gesetzt. Das liegt daran, dass die Datei in UTF16 und nicht in ASCII codiert ist. UTF16 ist eine Form der Unicode-Codierung, die statt 8 16 Bit verwendet, um ein Zeichen zu speichern. Dadurch wird es möglich, eine deutlich größere Zahl von Zeichen zu codieren. UTF16 ist abwärtskompatibel zu ASCII, verwendet also für die ersten 127 Zeichen die gleiche Muster. Das zweite Bit wird beim Einlesen mit ASCII-Codierung dann als Leerzeichen interpretiert. Das Problem lässt sich lösen, indem man Get-Content mti dem Parameter -Endoding anweist, den Text als UTF16 zu dekodieren.
get-content -Path .\lsasetup.log -Encoding Unicode
[11/ 4 15:31:14] 596.600> - In LsapSetRandomDomainSid()
[11/ 4 15:31:14] 596.600> - LsapGenerateRandomDomainSid: RtlAllocateAndInitializeSid returned 0x0
Das sieht schon viel besser aus. Wenn man mit Get-Content allerdings versucht, eine Binärdatei einzulesen, versucht Get-Content, auch den Binärcode in Textzeichen zu übersetzen. Das ist allerdings sinnlos, da der Binärcode ein Bitstrom ist und keinen Text darstellt. Das Ergebnis ist Kauderwelsch.