Vermutlich hat es sich inzwischen herumgesprochen, dass in Skripten (egal ob Powershell, Python, Batch oder welche Sprache auch immer) keine Kennwörter im Klartext abgespeichert sein sollen. Das ist alles ganz schön, aber wie soll man dann Kennwörter und Anmeldeinformationen speichern? In Powershell gibt es hierfür einige Möglichkeiten. In diesem A...
Weisheiten - der Netz-Weise Blog
Die Microsoft Data Protection API ist ein Feature, das Microsoft mit Windows 2000 eingeführt hat. Der Sinn der DPAPI ist es, Daten für den Benutzer transparent verschlüsselt ablegen zu können. Transparent bedeutet, dass der Benutzer von der Verschlüsselung nichts mitbekommt. Das passiert mit Hilfe der Anmeldeinformationen des Benutzers. Hier m...
Dass ein Kennwort ein generell unsichere Sache ist, haben inzwischen sogar Unternehmen wie Microsoft verstanden. Das grundsätzliche Problem von Kennwörtern ist, dass sie meist unsicher sind, oder nicht leicht zu merken. Das ist vor allem deshalb problematisch, da heute jede Website gerne eine Benutzerkonto anlegen möchte. Die Wiederverwendung von K...
Im letzten Artikel Default Shell in Server Core ändern habe ich beschrieben, wie Sie Powershell zur Default-Shell in Servercore machen können. Sie können aber auch das Tastaturlayout anpassen, wenn Sie bei der Installation die falsche Sprachversion ausgewählt haben. Hierzu passen Sie den Schlüssel HKEY_CURRENT_USER\Keyboard Layout\Preload an. Unter dem Schlüssel Preload sind die konfigurierten Tastaturlayouts gespeichert, die Servercore unterstützt, und zwar in numerischer Reihenfolge, wobei das Layout mit der Nummer 1 Priorität hat uns als erstes geladen wird.
Um das Tastaturlayout für den angmeldeten Benutzer anzupassen, setzen Sie einfach den Sprachcode Ihrer Tastatur für den Wert mit dem Namen 1. Für deutsche Tastaturen ist das 00000407. Das können Sie einfach im Regedit machen, oder mit folgender Codezeile:
Set-ItemProperty -Path HKCU:\Keyboard Layout\Preload -Name 1 -Value 00000407
Die vollständige Auflistung aller Codes finden Sie unter Default Input Profiles in Windows auf der Microsoft Website.
Wenn Sie sich in Windows Server Core einloggen, wird als Standard-Shell die Cmd.exe geöffnet. Das ist zwar unkritisch, da Sie den Server-Core im Normalfall eh nur remote konfigurieren, aber trotz allem manchmal nervig. So lange Microsoft die Standard-Shell nicht endlich auf Powershell umstellt, hilft es, die Default-Shell in der Registry anzupassen. Hierfür ersetzen Sie unter HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell explorer.exe durch Powershell.exe. Das geht ganz einfach über regedit, denn der Registry-Editor kann unter Server-Core direkt ausgeführt werden, oder Sie benutzen folgendes Powershell-Kommando:
Set-ItemProperty -Path HKLM:SOFTWARE\Microsoft\Windows NT\CurrentVersion\ -Name Winlogon -Value Powershell.exe
Die Shell wird für alle Benutzer auf den neuen Wert gesetzt, ist jetzt also der neue Default.
Wie Sie das Tastaturlayout in Server Core ändern, finden Sie unter Tastarlayout in Windows Server Core umstellen.
Eine Hashtable ist eine Schlüssel-Wertepaar-Liste zum Speichern von Konfigurationsinformationen. Solche Schlüssel-Wertepaare findet man überall, z.B. in ini-Dateien zur Konfiguration von Anwendungen. Die Windows Systemregistrierung ist nichts weiter als eine sehr große ini-Datei.
Hashtable werden in Powershell genau wie eine ini-Datei erstellt, allerdings in geschweifte Klammern eingeschlossen und mit einem @ eingeführt:
Pfad='C:\Windows'
SvcUser='netz-weise\SqlSvc'
Password='geheim'
}
Eine Hash-Table ist immer unsortiert, die Rückgabe erfolgt also in zufälliger Reihenfolge. Seit Powershell 3 kann man aber auch eine sortierte Hashtable erstellen, indem man [ordered] in der Defintion vor die Hash-Table schreibt:
Pfad='C:\Windows'
SvcUser='netz-weise\SqlSvc'
Password='geheim'
}
Wenn man so eine Hash-Table jetzt aber an einen Parameterblock übergibt und den Datentyp [Hashtable] erzwingen möchte, erhält man wieder eine unsortierte Hash-Table, da es sich bei einer sortierten Hashtable um einen eigenen Datentyp handelt und Powershell eine automatische Konvertierung durchführt.
Pfad='C:\Windows'
SvcUser='netz-weise\SqlSvc'
Password='geheim'
}
{
param(
[Hashtable]$Daten
)
$Daten
}
Das Problem besteht darin, dass eine sortierte und eine unsortierte Hashtable zwei unterschiedliche Datentypen sind. Geben Sie stattdessen [System.Collections.Specialized.OrderedDictionary] statt [Hashtable] als Datentyp an, funktioniert alles wie geschmiert. Die Funktion sieht dann so aus:
{
param(
[System.Collections.Specialized.OrderedDictionary]$Daten
)
}
Jedes Mal, wenn Windows Update einen neuen Suchvorgang startet, protokolliert es alle Schritte. Bis Windows 8 fand das in der Datei WindowsUpdate.log im %windir% statt, aber unter Windows 10 hat Microsoft diese Datei durch ein Ereignisprotokoll ersetzt. Prinzipiell ist die Idee gut, nur dummerweise loggt der Update-Dienst dort nicht im Klartext, so dass man mit den Daten nichts anfangen kann. Stattdessen muß man sich mit Powershell aus diesem Log wieder eine Log-Datei erzeugen lassen. Dies geschieht mit dem Cmdlet Get-WindowsUpdatelog. Gibt man zusätlich den Parameter -LogPath an, kann man festlegen, wohin das Log-File geschrieben wird. Standardmäßig wird die Datei auf dem Desktop des Users abgelegt.
Get-WindowsUpdateLog -LogPath c:\Temp\WindowsUpdate.log
Achten Sie darauf, den Dateinamen mit anzugeben. Das Cmdlet läuft sonst trotzdem durch, erzeugt aber keine Datei!
Die Datei wird sehr lang und ist nicht so einfach zu analysieren. Zum Glück kommt einem Powershell hier zur Hilfe. Ich habe eine kleine Funktion geschrieben, die mit Hilfe eines regulären Ausdrucks die Daten in Powershell-Objekte umwandelt, so dass die Daten z.B. in einem Gridview weiter analysiert werden können.
Function Show-UpdateLog {
param(
[Parameter(Mandatory=$true)]
$LogPath
)
Wenn Sie externe Email-Adressen auf eine Office 365 Mail-erteilergruppe weiterleiten wollen, müssen Sie für die externen Adressen zuerst einen Kontakt in Office 365 einrichten. Wechseln Sie hierzu im Administrativen Portal (Microsoft 365 admin Center) auf den Menüpunkt "Benutzer - Kontakte" und fügen Sie für die externen Kontakte Email-Adresse und Anzeigenamen hinzu. Wenn der Benutzer in der Organisation nicht im Adressbuch auftauschen soll, wählen Sie den Schieberegler "In meiner Organisation ausblenden" aus.
Anschliessend fügen Sie unter Gruppen -> Gruppen eine neue Gruppe hinzu. Wählen Sie als Gruppentyp "Verteilung" aus, geben Sie unter Grundlagen einen Anzeigenamen für die Gruppe an, unter Einstellungen legen Sie die Email-Adresse fest und wählen Sie den Haken "Personen außerhalb miener Organisation das Senden von E-Mails an diese Verteilergruppe gestatten" aus, wenn die Adresse auch von außerhalb Ihrer Organisation angesprochen werden soll. Der Anzeigename wird nur für die Anzeige im Portal und im Adressbuch verwendet.
Wenn Sie versuchen, Ihr Systemlaufwerk mit Bitlocker zu verschlüsseln, und Sie erhalten direkt nach dem Aufruf die Fehlermeldung "Das System kann die angegebene Datei nicht finden" fehl, prüfen Sie, ob im Ordner %Windir%\System32\Recovery eine Datei ReAgent.xml Datei liegt und benennen Sie sie z.B. in ReAgent.old um. Danach sollte die Verschlüsselung klaglos starten.
Kürzlich habe ich mein BCDEdit-Modul wieder angefasst, um einige Funktionen zu überarbeiten. Das Modul erstellt dabei dynamisch Objekte aus dem BCD-Store, indem es per regulärem Ausdruck die Ausgaben von bcdedit.exe einliest, auftrennt und als Objekt zurückgibt.
Dummerweise sind aber nicht alle BCD-Einträge gleich. Einige Eigenschaften werden von BCDedit nur angezeigt, wenn Sie auch tatsächlich gesetzt sind. Um in einer If-Abfrage keine Fehlermeldung zu bekommen, wenn die Eigenschaft gar nicht existiert - die Fehlermeldung kann auch nicht unterdrückt werden, da es sich um einen terminierenden Fehler handlet - muss vorher geprüft werden, ob die Eigenschaft vorhanden ist. Das geht tatsächlich sehr einfach, ist aber gut versteckt. Denn an jedem Objekt hängt ein verstecktes Memberset namens psobject, das nur angezeigt wird, wenn man get-Member mit dem Parameter -force aufruft.
get-childitem C:\Windows | get-member -force
PSObject beinhaltet Metainformationen über das Object, unter anderem eine Auflistung aller Eigenschaften.