PowerShell TLS Error

Seit einiger Zeit wird TLS 1.0 von vielen Seiten und Diensten nicht mehr unterstützt. Selbst au [Mehr]

Azure PowerShell Module Migration

Anfang des Jahres wurde das PowerShell Modul welches auf dem Azure Resource Manager Model basiert ersetzt durch das neue “Az” Modul welches auf .Net Standard basiert um CrossPlattform / PowerShell 6 Core kompatibel zu sein. Hier erkläre ich euch wie Ihr auf das neue Modul migriert. Das AzureRM Modul erhält seit Januar keine neue Funktionen mehr wird aber bis December 2020 noch BugFixes erhalten. Wenn Ihr jetzt bereits migrieren wollt ist es notwendig erst das alte Modul zu deinstallieren. Wenn Ihr das Modul als MSI Paket installiert könnt Ihr es direkt aus der Systemsteuerung heraus deinstallieren. Habt Ihr es via PowerShellGet installiert müsst Ihr mit den folgenden Schritten fortfahren. Da es durch Updates sein kann das mehrere Versionen parallel installiert sein können sollte vorher geprüft werden welche Versionen installiert sind. Mit folgender Befehlskombination lassen sich dann alle Module deinstallieren. Wichtig ist es hierbei natürlich die PowerShell als Administrator auszuführen. Sollten die Module sich nicht sauber deinstallieren lassen stellt uns Microsoft ein Skript auf der verlinkten Seite zur Verfügung. Bevor Ihr jetzt das neue Modul installieren könnt sollte man vorher prüfen das mindestens das .Net Framework in der Version 4.7.2 installiert ist sowie die PowerShell in der Version 5.1 . Das können wir mit einem einfachen Befehl überprüfen: Wenn man das Modul für alle User installieren will muss die PowerShell als Administrator installiert werden: Install-Module -Name Az -AllowClobber Alternativ hat man die Möglichkeit das Modul auch nur für seinen User zu installieren. Install-Module -Name Az -AllowClobber -Scope CurrentUser Nachdem das Modul installiert ist kommt jetzt der aufwendige Teil. Und zwar müssen alle eigenen Skripte und ähnliches jetzt überarbeitet werden. Während Ihr noch beschäftigt seit könnt Ihr Aliase aktivieren sodass keine Fehler bei Skript Ausführung auftreten. Enable-AzureRmAlias Herzlichen Glückwunsch jetzt habt Ihr auf die aktuelle Version migriert. Dieses Thema ist unteranderem Bestandteil in unserem Kurs Azure - Cloud-Dienste administrieren

PowerShell PSReadlineOption not working

Seit Windows 10 1809 funktioniert der Befehl “Set-PSReadlineOption –TokenKind” zum ändern der einzelnen Textfarben in PowerShell nicht mehr wie ich es in einem früheren Blog Post erklärt hatte. Ab Windows 10 1809 bzw folgender Modulversion wird das festlegen der einzelnen Farben jetzt nicht mehr über ein Tokenkind definiert. Stattdessen wird jetzt mit einer Art Hashtable gearbeitet. Ich habe eine PowerShell Profile Example Datei erstellt welche ich auch über ein GitHub Projekt zur Verfügung stelle. Da es teilweise Umgebungen gibt in denen PowerShell Profile zentral verwaltet und verteilt werden habe ich mein PowerShell Profil mit einer Abfrage versehen sodass die Befehle je nach betreffender Modulversion ausgewählt werden.

Network Troubleshooting mit PowerShell Teil1

In diesem Blog Artikel werde ich euch in die Möglichkeiten des Netzwerk Troubleshootings mithilfe de [Mehr]

PowerShell 5.0 Schriftfarben anpassen

Die Farbdarstellung in der PowerShell ab der Version 5.0 (Windows 10 / Server 2016) ist aufgrund des SyntaxHighlighting in den Standardfarben auf dem Monitor annehmbar dargestellt. Sobald man jedoch die Shell in Präsentationen oder Trainings verwendet wird es schnell über den Beamer schwer leserlich. Wie ihr das umstellen könnt erfahrt ihr im folgenden BlogArtikel. Standardmäßig finden wir folgende farbliche Darstellung in der PowerShell, die wie gesagt auch gerne mal zum Problem werden kann. Die Standardschriftfarbe und der Hintergrund lässt sich noch relativ leicht über die GUI einstellen. Danach enden auch schon  die grafischen Möglichkeiten. Will man sein PowerShell Fenster weiter anpassen muss man das mit den passenden  Befehlen und Variablen umsetzen. Dafür nutze ich folgendes cmdLet: Set-PSReadlineOption Mithilfe dieses cmdLet lassen sich die einzelnen Bestandteile setzen, wie z.B. die Farbe des “Command” Highlighting, von Gelb auf Dunkelblau. Set-PSReadlineOption -TokenKind Command   -ForegroundColor DarkBlue Was ich persönlich sehr praktisch finde wenn man den Hintergrund auf weiß setzt. Leider werden diese Änderungen nicht gespeichert und müssen jedes mal neu gesetzt werden. Es sei denn, man erstellt sich dafür ein PowerShell Profil. Dieses Profil ähnelt einem Skript welches beim starten einer neuer PowerShell zuerst ausgeführt wird. Ob ihr bereits ein Profil habt könnt ihr mit folgendem Befehl testen. Bekommt ihr, so wie hier im Beispiel, als Rückgabe “False” geht es jetzt im nächsten Schritt darum ein neues Profil zu erstellen. Dieses könnt ihr mit folgenden Befehl erstellen. Nach dem erstellen wartet die Datei nur noch darauf von uns editiert zu werde. Den Dateipfad können wir der Verzeichnisangabe entnehmen und anschließend die Datei in einem Editor, wie zum Beispiel der Powershell ISE, bearbeiten. Zu Anfangs ist diese Datei komplett leer. Ich befülle diese dann mit folgenden Werten. Zuerst erstelle ich mir eine Variable in der ich mir das Objekt der Oberfläche speichere, um einige Anpassungen einfach tätigen zu können. So setze ich z.B. den Fenster Titel auf “StefanO Shell” und die Standard Hintergrund- und Standard Schriftfarbe. Anschließend setze ich die verschiedenen Farben für die jeweiligen “TokenKinds” wie z.B. “Command,Parameter,Number,Member” . Das komplette Skript stelle ich über folgenden GitHub zur Verfügung. Für weitere Fragen stehe ich euch in dem PowerShell Kurs der ppedv AG zur Verfügung.

Microsoft Technical Summit 2015 – Die Video-Aufzeichnungen sind verfügbar!

Wer die Sessions des Summits noch einmal in Ruhe zuhause ansehen will oder gar nicht beim Summit dabei sein konnte, aber sich für die Inhalte interessiert, hat jetzt die Möglichkeit, die Videos und Unterlagen herunterzuladen. Unter http://www.microsoft.com/germany/technical-summit/nachlese-2015.aspx sind alle Sessions der beiden tage mit den jeweiligen Infos sowie den Unterlagen und Videos aufgelistet. Hier bekommt man die Videos in mittlerer Qualität. Unter https://channel9.msdn.com/Events/microsoft-techncial-summit/Technical-Summit-2015-The-Next-Level stehen alle Videos in 3 Qualitätsstufen zur Verfügung – und auch als MP3 Podcast. Ich habe ein PowerShell-Script geschrieben, was den Download aller Videos in einer benutzerdefinierten Qualitätsstufe ohne großen Aufwand erledigt: Das komplette Script könnt ihr hier herunterladen: http://1drv.ms/1TelkeJ Der Aufruf erfolgt dann in etwa so: .\Get-MSTS15Content.ps1 -OutFolder D:\MSTS15 -VideoQuality Low Viel Spaß damit!

Microsoft Technical Summit 2015: Meine Session zum Thema PowerShell 4.0 und 5.0

Für all diejenigen, die in meiner Session zum Thema “Deep Dive – Neuerungen in PowerShell 4.0 und 5.0” auf dem Microsoft Technical Summit 2015 in Darmstadt gesessen haben – und auch für die, die es nicht geschafft haben – stelle ich hier meine Folien und Beispiel-Skripte bereit. Sobald die Video-Aufzeichnungen verfügbar sind, werde ich diese ebenfalls hier veröffentlichen… Downloads: PowerPoint-Slide-Deck PowerShell-Skripte und Beispiele

SCVMM 2012 R2: Konsole stürzt nach dem Hinzufügen einer Benutzerdefinierten Eigenschaft (“Custom Property”) ab

Heute hatte ich folgenden Effekt: Nach dem Erstellen einer neuen “Custom Property” mit dem Namen “HDD-Typ SSD,SAS,SATA” (Sonderzeichen wie Klammern und Schrägstriche sind nicht zulässig und werden von der GUI abgefangen) stürzt die SCVMM Konsole sofort ab und lässt sich auch nicht wieder starten. Der erste Fehler hat den Ereignisnamen “CLR20r3” an der “VmmAdminUI.exe”. Vermutlich gibt es für dieses Problem mittlerweile einen Patch, aber die verwendete Umgebung war nicht komplett gepatcht. Also musste eine Alternative her. Naheliegend war das Löschen der neu angelegten Eigenschaft, aber dies musste ohne GUI erfolgen (diese ließ sich wegen des Crashes ja nicht starten). Also bleibt nur die PowerShell… Zunächst habe ich mit “Get-SCCustomProperty” nach der betreffenden Eigenschaft gesucht: Der komplette Aufruf: Get-SCCustomProperty | Where Name -NotLike "Custom*" Danach kann man diese mit “Remove-SCCustomProperty” löschen: Der komplette Aufruf: Get-SCCustomProperty -Name "HDD-Typ SSD, SAS, SATA" | Remove-SCCustomProperty Danach startet auch die Konsole wieder! Hinweis: Zur Nutzung der SC-Kommandos muss das entsprechende Modul geladen sein. Dies geht am einfachsten, in dem man auf dem SCVMM-Server selbst die “Virtual Maschine Manager Command Shell” startet:

Windows 10: VPN-Verbindungen nutzen immer Remote-Gateway

Unter früheren Windows-Versionen konnte man bei VPN-Verbindungen noch den gesamten IPv4-Teil konfigurieren. Dort gab es eine Option “Standardgateway für das Remotenetzwerk verwenden”, die man abschalten konnte: Standardmäßig war/ist diese Option eingeschaltet und sorgt dafür, dass SÄMTLICHER Datenverkehr über das Remote-Netz geleitet wird, auch das, was eigentlich “DIREKT” ins Internet gehen könnte. Der Vorteil dabei ist, dass der Traffic vom eigenen Endgerät bis zum Firmennetzwerk verschlüsselt ist, was insbesondere dann nützlich ist, wenn man in einem Internetcafe oder Hotel-WLAN sitzt und nicht klar ist, wer den Verkehr mithören kann. Will man nun auf einem Windows 10 Client dieses Verhalten ändern – also erreichen, dass nur Traffic, der für das Remote-Netzwerk gedacht ist, über VPN geht, der Rest direkt ins Internet, müsste man diesen Haken entfernen, was bei Windows 10 nicht mehr geht, da sich die IPv4-Optionen der VPN-Verbindung nicht mehr öffnen lassen. Was man aber tun kann, ist dieses Verhalten mit Hilfe der PowerShell herbeizuführen, und zwar mit diesem Aufruf: Damit wird für alle VPN-Verbindungen das “Split-Tunneling” aktiviert, was eben diesem Haken entspricht. Hier der Aufruf nochmal zum direkt Kopieren: Get-VpnConnection | Set-VpnConnection -SplitTunneling $True

Microsoft DNS-Server: Einträge massenweise “umziehen”

Wenn man mit einem Webserver zu einem anderen Provider wechselt oder aus sonstigen Gründen neue (öffentliche) IP Adressen zugewiesen bekommt, dann müssen natürlich auch die entsprechenden DNS-Einträge geändert werden. Wenn es sich hierbei nur um eine Hand voll handelt, könnte man dies auch manuell machen. Ab einer gewissen Menge ist das einfach nicht mehr praktikabel, da es a) zu lange dauert und b) auch sehr fehleranfällig wäre. Als sinnvolle Lösung bietet sich hier die PowerShell an – vorausgesetzt, man hat einen Microsoft Windows Server als DNS-Server und auf diesem das entsprechende DNSServer Modul für die PowerShell verfügbar. Das Skript, welches am Ende des Beitrages zum Download angeboten wird, sieht so aus: <# .Synopsis This script changes DNS A Records according to a CSV file - use at your own risk! .DESCRIPTION This script changes DNS A Records according to a CSV file. The csv file should look like this: "OldIP","NewIP" "1.2.3.4","5.6.7.8" "2.4.6.8","1.3.5.7" to change all DNS records with "1.2.3.4" as value for "5.6.7.8" and "2.4.6.8" for "1.3.5.7" .EXAMPLE Replace-DNSServerRecords.ps1 -CSVFile H:\OldAndNewIps.txt Replaces the DNS A records on the localhost DNS server according to the CSV-File H:\OldAndNewIps.txt .EXAMPLE Replace-DNSServerRecords.ps1 -CSVFile H:\OldAndNewIps.txt -DNSServer mydns.domain.local -Verbose Replaces the DNS A records on the DNS server "mydns.domain.local" according to the CSV-File H:\OldAndNewIps.txt and writes verbose output #> Param( [Parameter(Mandatory=$True)] [ValidateScript({Test-Path $_ -PathType 'Leaf'})] [string]$CSVFile, [string]$DNSServer = "localhost" ) Write-Warning "This script will possibly change a lot of DNS records. If you wish to cancel, press [CTRL]+[C], otherwise press [Enter]!" Read-Host # just in case of old PowerShell Import-Module DNSServer $CSVData = Import-CSV $CSVFile $OldDNSRecordData = $CSVData.OldIP $NewDNSRecordData = $CSVData.NewIP $AllDNSZones = (Get-DnsServerZone -ComputerName $DNSServer | Where-Object IsReverseLookupZone -eq $False).ZoneName $TotalChanges = 0 ForEach($CurrentDNSZone in $AllDNSZones) { Write-Verbose "Processing current zone $CurrentDNSZone..." $AllDNSARecordsInZone = Get-DnsServerResourceRecord -ZoneName $CurrentDNSZone -RRType A -ComputerName $DNSServer Write-Verbose "Found $(($AllDNSARecordsInZone | Measure-Object).Count) DNS Records in current Zone" ForEach ($CurrentRecord in $AllDNSARecordsInZone) { for($i=0; $i -lt $OldDNSRecordData.Length; $i++){ If($CurrentRecord.RecordData.IPv4Address -eq $OldDNSRecordData[$i]) { Write-Verbose "Found an old DNS Record:" Write-Verbose "$($CurrentRecord.HostName) with $($CurrentRecord.RecordData.IPv4Address) in Zone $CurrentDNSZone" $NewRecord = $CurrentRecord.Clone() $NewRecord.RecordData.IPv4Address = $NewDNSRecordData[$i] Set-DnsServerResourceRecord -OldInputObject $CurrentRecord ` -NewInputObject $NewRecord ` -ZoneName $CurrentDNSZone ` -ComputerName $DNSServer $TotalChanges++ } } } } Write-Host "Changed Records: $TotalChanges"   Das Skript durchläuft alle Forward-DNS-Zonen und prüft dabei nacheinander alle vorhandene A-Records gegen die Liste der zu ändernden Einträge. Wenn ein entsprechender Eintrag gefunden wird, wird für diesen die IP-Adresse gegen die neue ausgetauscht. Am Ende gibt das Skript aus, wieviele Einträge insgesamt geändert wurden. Aus Sicherheitsgründen ist nach dem Start noch einmal zu bestätigen, dass das Skript seine Arbeit verrichten soll. Das fertige Skript kann hier heruntergeladen werden: Replace-DNSServerRecords.zip Die Benutzung geschieht auf eigene Gefahr! Sie wollen lernen, wie dieses Script im Detail funktioniert oder derartige Scripte selber schreiben? Dann besuchen Sie unseren PowerShell-Kurs!