Netz-Weise Logo

Weisheiten - der Netz-Weise Blog

Hier finden Sie Tipps und Tricks für vor, während und nach der Schulung.

Computernamen und DNS-Namen einer Maschine mit Powershell ermitteln

Um den Computernamen zu ermitteln, kann man den Kommandozeilenbefehl Hostname verwenden. Es gibt in Powershell aber keine direkte Möglichkeit, den DNS-Namen eines Computers abzufragen. Hier hilft die DNS-Klasse aus dem .Net Framework aus:

Hostname # Zeigt den Netbios-Computernamen an
$ComputerSystem = [System.Net.Dns]::GetHostByName(($env:computerName))

Das zurückgelieferte Objekt hat drei Eigenschaften, Hostname, Aliases und Addresslist

HostName          Aliases AddressList
--------          ------- -----------
DC1.netz-weise.eu {}      {10.1.0.200}

 

Markiert in:

Windows 10 startet immer neu statt herunterzufahren

Unter Windows 10 kann es vorkommen, dass das Herunterfahren des Systems einen Neustart auslöst, anstatt das Gerät auszuschalten. Die Ursache ist vermutlich ein fehlerhafter Treiber, der Windows daran hindert, in den Energiesparmodus zu wechseln. Es handelt sich hierbei um eine neue Funktion, die mit Windows 8 eingeführt wurde, und die als Schnellstartmodus bezeichnet wird. Anstatt das System vollständig herunter zu fahren, wird der aktuelle Benutzer nur abgemeldet und das System dann in den Hibernation-Mode (Ruhezustand) versetzt. Im Ruhezustand wird der Inhalt des Arbeitsspeichers in die Datei hiberfil.sys geschrieben und beim Einschalten wieder gestartet. Dadurch muß beim Hochfahren des Systems nicht mehr das Gerät initialisiert werden, sonden es wird nur noch der letzte Zustand geladen, was deutlich schneller geht.

Wenn ein Fehlerhafter Treiber, eine Fehlerhafte Datei oder ein Bug in Windows das Herstellen des Ruhezustands verhindert, schaltet sich der Rechner nicht ab, sondern öffnet sofort wieder das Anmeldefenster. Um das Problem temporär zu lösen, können Sie den Rechner zwingen, komplett herunter zu fahren, indem Sie beim Klicken auf den Eintrag "Herunterfahren" die Shift-Taste gedrückt halten. Alternativ können Sie den Rechner mithilfe der Kommandozeile ausschalten. Erstellen Sie sich dazu ein Batch-Datei (eine Textdatei mit der Endung .cmd oder .bat) und schreiben Sie folgenden Befehl in die Datei:

Shutdown /s /t 0

Der Shutdown-Befehl fährt den Rechner immer komplett herunter, es sei denn, sie geben explizit den Parameter /hybrid mit an.

Um den Fehler zu beheben, stehen Ihnen, je nach Ursache, mehrere Möglichkeiten zu Auswahl. Wenn es sich um ein Problem des Betriebssystems handelt, dass nach einem Update aufgetreten ist, hilft es vielleicht schon, die neuesten Windows-Updates einzuspielen. Hilft das nicht, versuchen Sie die Gerätetreiber zu akutalisieren. Übliche Verdächtige sind die Netzwerkkarte, die Grafikkarte oder die Chipsatztreiber.

Weiterlesen

Mehrfach-Umbenennen mit Powershell, Rename-Item und regulären Ausdrücken

Eine Datei umzubenennen ist mit Powershell mit Hilfe des Cmdlets Rename-Item relativ einfach möglich. Sie müssen nur den Namen der Datei und den neuen Namen angeben:

Rename-Item -Path C:\temp\Test.txt -NewName Produktion.txt

Es gibt aber auch die Möglichkeit, mehrere Dateien in einem Rutsch umzubenennen. Hierfür können Sie die umzubennenden Dateien per Pipeline an Rename-Item weiterleiten und neuen Namen über einen Skriptblock definieren:

Get-ChildItem -Path C:\Skripte\*.ps1 | Rename-Item -NewName { $_.basename + ".txt"  }

In diesem einfachen Beispiel werden alle Dateien mit der Endung .ps1 im Ordner c:\Skripte in .txt umbenannt - $_ ist ein Platzhalter für die einzelnen Dateien, .basename beinhaltet den Dateinamen ohne Dateiendung.

Weiterlesen
Markiert in:

Powershell Ausgabeströme verstehen und umleiten

"Ein Überblick darüber, wie Powershell Daten ausgibt, und wie sie dieses Verhalten steuern können. Wenn Sie in Powershell Daten an der Konsole ausgeben wollen, stehen Ihnen eine ganze Reihe von Commandlets zur Verfügung. Die wichtigsten sind:

  • Write-Output
  • Write-Error
  • Write-Warning
  • Write-Verbose
  • Write-Debug

Außerdem gibt es noch das gerne genutzte, aber leider böse Write-Host. Warum Write-Host böse ist, werden Sie gleich verstehen. Die 5 vorgestellten Commandlets haben alle eigene ""Ausgabeströme"" oder Kanäle, in denen die Daten ausgegeben werden. Man kann sich das vorstellen wie 5 parallele Straßen, auf denen der Verkehr geregelt wird. Die Linke Spur ist für LKW vorgesehen, die 2. Spur für Busse, die 3. für Taxen, die 4. für normalen Personenverkehr und die 5. für Einsatzfahrzeugt. Normalerweise sind die Spuren komplett voneinander getrennt, kommen sich also nicht in Gehege. Der normale Ausgabestrom wird auch von der Pipeline genutzt. Daten, die mit Write-Output in den Ausgabestrom geschrieben werden, landen in der Pipeline und können dort weiterverarbeitet werden. Alle anderen Ausgaben (Fehler, Debugmeldungen usw.) landen nicht in der Pipeline, da die Pipeline nur am Standard-Ausgabestrom hängt. Dadurch können alle in der Pipeline nicht benötigten Daten aus Ihr heraus gehalten werden. Genau wie auf einer Straße die Spuren gewechselt werden können, kann man in der Powershell auch Daten umleiten. Dafür gibt es den Umleitungsoperator >&. Vor dem > steht der Strom, der umgeleitet werden soll, hinter dem & steht der Strom, auf den umgeleitet werden soll. Die Ströme sind eindeutig durchnummeriert: 1 Output 2 Error 3 Warning 4 Verbose 5 Debug Das Kommando

$VerboseMessage = Write-Verbose -message "Dies ist eine Ausgabe" -verbose 4>&1

schreibt die Ausgabe des Write-Verbose-Befehls in eine Variable. Geben Sie nur

$VerboseMessage = Write-Verbose -message "Dies ist eine Ausgabe" -verbose

ohne den Umleitungsoperator an, wird die Nachricht ausgegeben, aber nicht in der Variablen gespeichert. (Der Parameter -verbose ist übrigens dafür da, ausführliche Nachrichten überhaupt erst auszugeben. Write-Verbose Ausgaben werden nur angezeigt, wenn die Variable $VerbosePreference auf Stop, Inquire oder Continue gesetzt ist, oder im Commandlet explizit der Parameter -verbose gesetzt wurde.) Das die Ausgabe nur mit dem Zuweisungsoperator 4>&1 gespeichert wird, liegt daran, dass in Variablen immer nur der Standard-Ausgabestrom gespeichert wird. Dadurch werde Fehlermeldungen usw. aus den Variablen heraus gehalten. Wollen Sie alle Ausgaben in eine Datei speichern, so hilft Ihnen die Umleitung *> c:\outputfile.txt Diese Ausgabe leitet sämtliche Ausagen in die Zieldatei um. Aber dummerweise nicht die Ausgaben, die write-host generiert. Write-Host nutzt nämlich keinen der Ausgabeströme, sondern schreibt direkt in die Konsole. Dadurch geht sämliche Kontrolle über die Ausgabe verloren. Nutzen Sie daher am Besten, soweit möglich, immer write-output für Ihre Ausgaben. "

Bitlocker mit FDE (Verschlüsselung in Hardware) nutzen

*Update*: Microsoft unterstützt die Verschlüsselung in Hardware seit Windows 10 1903 nicht mehr, da es zu häufig Probleme mit der Implementierung der Hersteller gab.

"So verschlüsseln Sie Ihre Festplatte performant, aber zentral verwaltet Seit Windows 8 unterstützt Bitlocker die Möglichkeit, direkt die Hardwareverschlüsselung der Festplatte zu nutzen. Diese Technik wird von Microsoft als edrive bezeichnet. Dadurch, dass Bitlocker die Daten nicht mehr verschlüsseln muß, bevor er sie auf der Festplatte speichert, bekommt man die Verschlüsselung quasi komplett ohne Performance-Einbußen. Im Gegensatz zur reinen FDE-Verschlüsselung (Full Drive Encryption), also der Verschlüsselung direkt durch die Festplatte ohne Bitlocker, kann man die Verschlüsselung aber zentral administrieren. Leider ist das Feature mal wieder bescheiden dokumentiert. Daher habe hier nach einer langen Leidens- bzw. Experimentierphase mal alle Erkenntnisse zusammengetragen. Um Bitlocker mit FDE nutzen zu können, benötigt man zum einen eine Festplatte (SSD), die FDE unterstützt und OPAL 2.0 kompatibel ist. Zwei Modelle, von denen ich das definitv weiß, sind die Crucial M500 und Nachfolgemodelle, sowie die Samsung Evo 840. Zum anderen muß der Computer bereits über UEFI-Bios (ab UEFI 2.3.1) verfügen und UEFI muß aktiviert sein. Der Secure Boot Mode darf laut Crucial nicht aktiviert sein! Um die Hardware-Verschlüsselung nutzen zu können, muß Windows im UEFI-Modus installiert werden. Das passiert automatisch, wenn das BIOS auf UEFI-Boot gesetzt ist. Eine große Stolperfalle: Die Festplatte muß leer und blank sein, wenn Windows die Installation startet. Dafür reicht es NICHT aus, die Partitionen auf der Festplatte im Installationsmenü zu löschen - das habe ich auf dem harten Weg gelernt. Löschen Sie stattdessen die Festplatte mit Diskpart, falls die Platte bereits initialisiert war. Dazu können Sie im Installationsmenü von Windows 8 die Tastenkombination shift-F10 drücken. Dann öffnet sich ein Kommandozeilenfenster. Geben Sie folgende Befehlskombination ein:

List Disk 
-> Finden Sie aus der List Ihre SSD
Select Disk
-> Geben Sie die Nummer Ihrer Festplatte an
Clean
-> löscht die Festplatte ratzekahl leer

Achtung! Clean heißt, dass die Festplatte komplett komplett gelöscht wird. Die Partitionen genauso wie die Partitionstabellen werden entfernt. Kontrollieren Sie also 3 mal, ob sie den richtigen Datenträger ausgewählt haben. Nun können Sie Windows 8 installieren. Nach der Installation können Sie Bitlocker installieren. Wenn Sie kein TPM (Trusted Platform Module) in Ihrem PC haben, müssen Sie Windows explizit erlauben, die Verschlüsselung mit USB-Datenträger oder Kennwort zu sichern. Starten Sie hierfür GPEdit.msc und öffnen Sie ""Computerkonfiguration -> Administrative Vorlagen -> Windows Komponenten -> Bitlocker Laufwerksverschlüsselung -> Betriebssystemlaufwerke -> Zusätzliche Authentifizierung beim Start anfordern"" und setzen sie den Radiobutton bei aktiviert. Anschliessend klicken Sie auf OK. Um sicher zu gehen, dass Sie wirklich die Hardwareverschlüsselung nutzen, verwenden Sie zur Aktivierung am Besten die Powershell. Starten Sie dafür ein Windows Powershell-Fenster mit Administrativen Rechten und starten Sie folgenden Befehl:

$password = ConvertTo-SecureString -String "Passwort" -AsPlainText -Force
Enable-BitLocker -MountPoint "C:" -HardwareEncryption -PasswordProtector -Password $Password

Wobei Mountpoint dem Laufwerk entspricht, dass Sie verschlüsseln wollen. Gibt es ein Problem mit Ihrer Konfiguration, meldet der Befehl, dass eine Hardwareverschlüsselung nicht möglich ist. Um Bitlocker per GUI zu aktivieren, starten Sie die Systemsteuerung, wählen ""Bitlocker Laufwerkverschlüsselung"" und dann aktivieren für das zu verschlüsselnde Laufwerk. Geben Sie ein Kennwort ein und wählen Sie, wo Sie den Wiederherstellungsschlüssel speichern wollen (Achtung! Wenn Sie den Wiederherstellungsschlüssel verlieren und Ihr Kennwort vergessen, kann bestenfalls der NSA noch Ihre Daten wiederherstellen, wobei selbst das eher unwahrscheinlich ist!). Danach wird eine Systemüberprüfung durchgeführt. Wenn Ihnen Bitlocker da"

VHD-Dateien beim Windows-Start automatisch mounten

"So mounten Sie eine VHD oder VHDX-Datei beim Systemstart von Windows automatisch Windows kann seit Vista virtuelle Festplatten wie normale Datenträger bereit stellen. Um das zu bewerkstelligen, können Sie in die Computerverwaltung -> Datenspeicher -> Datenträgerverwaltung gehen, das Kontextmenü der Datenträgerverwaltung öffnen und auswählen "virtuelle Festplatte anfügen". Alternativ können Sie auch das Powershell-Commandlet Mount-VHD verwenden:

mount-vhd -path C:\vhd\daten.vhdx 

Leider ist der Datenträger nur so lange eingehängt, bis der Computer neu gestartet wird. Wenn Sie die virtuelle Festplatte aber gerne bei jedem Systemstart verfügbar hätten, müssen Sie tricksen. Variante 1: Nutzen Sie das Tool vhd attach. VHD Attach stellt eine grafische Oberfläche für die Verwaltung von VHD-Dateien zur Verfügung, installiert aber auch einen Dienst, der beim Systemstart eine vhd-Datei einhängen kann. Dafür starten Sie VHD Attach, mounten die Festplatte, die sie benötigen, und klicken dann im Menü auf ""Auto-Mounted"". Variante 2: Wenn Sie mehrere Maschinen mit einem Auto-Mount einrichten oder ohne Installation auskommen wollen, hilft Ihnen der Task-Scheduler weiter (Aufgabenplanung im Deutschen). Hier können Sie eine Aufgabe anlegen, die beim Systemstart ausgeführt wird und ein Powershell-Script mit mount-vhd startet. Und als kleine Fingerübung machen wird das gleich mit Powershell und einem geplanten Task. (Mehr zu geschedulten Tasks und Jobs in meinem nächsten Tipp).

$user = new-object -typename System.Management.Automation.PSCredential -argumentlist $Username,$Password 
$action = $jobtrigger = New-JobTrigger -AtStartup
New-ScheduledTaskAction -Execute 'powershell.exe' -Argument "-noprofile -command mount-vhd -Path 'C:\vhd\daten.vhdx'"
Register-ScheduledTask -TaskName Mount_VHD -Trigger $jobtrigger -Action $action -User "system" -RunLevel Highest

Der Jobtrigger -AtStartup legt fest, dass der Task beim Systemstart ausgeführt werden soll. Mit Register-ScheduledTask wird die Aufgabe im Taskplaner registriert. Die Action ist der Powershell-Aufruf, der das Befehl "Mount-VHD" startet. Erwähnenswert ist noch, dass der Task als Benutzer "System" gestartet wird und damit automatisch administrative Rechte hat. Um den Task als System zu starten, benötigt man allerdings administrative Berechtigungen.

Bitlocker-Laufwerke wiederherstellen ohne Recovery-Key

Wenn Ihr Rechner mit einer Bitlocker verschlüsselten Festplatte arbeitet und aufgrund eines Bootproblems nicht mehr startet, benötigen Sie den Recovery-Key - oder diesen Artikel. Wenn Ihr Rechner mit einer Bitlocker verschlüsselten Startpartition arbeitet, kann es schon mal passieren, dass der Rechner nach einem Absturz nicht mehr starten will. Dann benötigen Sie, um aus den Reparaturoptionen auf das Laufwerk zugreifen zu können, den Recovery-Key, der beim erstellen des Laufwerks erzeugt wurde. Oder Sie starten eine Kommandozeile und entschlüsseln die Platte mithilfe des Kommandozeilentools manage-bde.exe. manage-bde kann die Festplatte von der Kommandozeile aus mit der Recovery-Key-Datei, dem Recovery-Kennwort (ein ellenlanger Zahlenschlüssel) oder mit dem Kennwort entschlüsseln, mit dem Sie die Platte verschlüsselt haben. Starten Sie hierzu Ihren Rechner, geben Sie Ihr Kennwort ein, und warten Sie, bis Windows Sie ihnen sagt, dass der Rechner nicht gestartet werden kann. Wählen Sie dann Reparieren oder Problembehandlung und dann erweiterte Optionen. Anschliessend wählen Sie "Eingabeaufforderung aus.  Der Rechner startet nun neu. Melden Sie sich an und geben Sie in der sich öffnenden Kommandozeile folgenden Befehl ein, wobei Sie C: durch den Laufwerksbuchstaben ihres verschlüsselten Laufwerks ersetzen: 

manage-bde -unlock c: -password "Ihr Kennwort"
manage-bde -off C:

Das Laufwerk wir jetzt entschlüsselt und Bitlocker deaktiviert. Anschließend können Sie Ihren Rechner wieder im Reparaturmodus starten. An dieser Stelle empfiehlt es sich, eventuell schnell noch ein Backup Ihrer Daten zu machen. Anschliessend können eventuell folgende Befehle Ihren Rechner wieder flott machen: 

chkdsk C: /V /F
bootrec /fixboot
bootrec /RebuildBcd

Übrigens ist es für dieses Vorgehen notwendig, den Rechner wirklich über den Reparaturmodus zu starten, nicht über einen PE-Stick. Ansonsten könnte Sie beim aufrufen von manage-bde folgende Fehlermeldung begrüßen:

ERROR: An error occurred <code 0x80070057>
The parameter is incorrect

Hyper-V VM startet nicht mit Fehler "weil der Hypervisor nicht ausgeführt wird"

Ihre Hyper-V virtuellen Maschinen melden "Der virtuelle Computer konnte nicht gestartet werden, da der Hypervisor nicht ausgeführt wird" Dieses Problem kann auftreten, wenn die Virtualisierungsfunktionen im BIOS nicht freigeschaltet sind. Das kann man z.B. mit dem Sysinternals-Tool "Coreinfo" aus der Sysinternals-Suite testen. Eine weitere Ursache kann sein, dass der Hypervisor-Eintrag im Boot-Menü fehlt, z.B. nach einer Reparatur des Bootmenüs, oder wenn Sie von einer vhd aus Ihr Windows starten. Dann hilft folgender Aufruf in einer vom Administrator gestarteten Kommandozeile (rechte Maustaste auf cmd.exe und "Ausführen als Administrator):

bcdedit /set hypervisorlaunchtype Auto

Get-content und der RAW-Switch

"Mit Powershell 3.0 wurde der Get-Content-Befehl um einen Switch-Parameter erweitert, um Inhalte in einen einzigen String einzulesen statt zeilenweiseDer Get-Content-Befehl liest Textdateien normalerweise Zeilenweise ein. Der Inhalt einer Textdatei wird damit in ein Array eingelesen, wobei jede Zeile in einer einzelnen String-Variablen gespeichert wird. Das ist allerdings nicht nur langwierig, sondern oft auch nicht erwünscht. Mit dem -RAW Switch ignoriert get-content Newline-Zeichen und liest den Dateiinhalt in einen einzigen String ein. Das geht deutlich schneller, wenn man nicht auf die einzelnen Zeilen zugreifen möchte, sondern den Dateiinhalt braucht, wie er ist. Wenn es um sehr große Dateien geht, erweist sich die .net-Klasse [io.file] als noch deutlich schneller: $file = [io.file]::ReadAllLines('C:\temp\WindowsUpdate.log')"

Werte und Arrays aus Funktionen zurück liefern

Eine Funktion bei Powershell ist eigentlich nur ein benannter Scriptblock. Funktionen kann man nutzen, um Scripte übersichtlicher zu gestalten und bestimmte Funktionalitäten immer wieder aufrufbar in einen Block zu "giessen". Wenn Sie eine Funktion schreiben, soll diese fast immer auch Werte zurück liefern, mit denen Sie weiterarbeiten können. In vielen anderen Programmiersprachen verwendet man hierzu das Return-Statement. Powershell kann das grundsätzlich auch, allerdings ist das Return-Statement nicht wirklich notwendig, um Rückgaben zu erzeugen, da grundsätzlich jede Ausgabe von einer Funktion ausgegeben wird. Hierzu ein kleines Beispiel:

function Return-Value
{
    1
    Return 2
}
$Rueckgabe = Return-Value

Was befindet sich jetzt in der Variable $Rueckgabe? Nicht der Wert 2, wie man vermuten könnte, sondern $Rueckgabe ist ein Array, dass die Werte 1 und 2 enthält. Ein weiteres Beispiel:

function Return-Value
{
    1
    2 "Schoene Gruesse von Return-Value"
}
$Rueckgabe = Return-Value

$Rueckgabe ist wieder ein Array, das 3 Werte enthält, und das auch ohne Return. Return ist zur Rückgabe von Werten also nicht notwendig. Wofür benötigt man dann noch Return? Return beendet außerdem die Funktion. Befehle, die nach Return stehen, werden also nicht ausgeführt! Wenn Sie Arrays aus einer Funktion zurück liefern wollen, müssen Sie vorsichtig sein! Möchten Sie beispielsweise 2 Arrays zurückgeben, so fügt Powershell diese in der Rückgabe zu einem Array zusammen:&nb

function Return-Value 
{
$arr1 = 1,2,3,4
$arr2 = 5,6,7
$arr1
$arr2
}
$Rueckgabe = Return-Value

Rueckgabe enhält wiederum ein Array mit den Werten 1 bis 7. Geben Sie $Rueckgabe[0] an, so erhalten Sie aber nicht das erste Array, sondern nur den Werte 1. Um Powershell anzuweisen, die Arrays beizubehalten, müssen Sie der Ausgabe ein Komma voran stellen:

function Return-Value 
{
$arr1 = 1,2,3,4
$arr2 = 5,6,7
$arr1,$arr2
}
$Rueckgabe = Return-Value

Dann gibt $Rueckgabe[0] auch die Werte 1 bis 4 zurück.