Netz-Weise Logo

Weisheiten - der Netz-Weise Blog

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

Symbole in der Windows-Taskleiste funktionieren nicht

Seit einiger Zeit habe ich auf mehreren Windows 11-Rechnern ein ziemlich merkwürdiges Problem - einige Icons in der Taskleiste werden mit einem Standard-Icon statt mit dem zugehörigen Programm-Icon angezeigt. Das Problem scheint ein Bug in Windows 11 zu sein, und die Ursache ist ein korrupter Icon Cache. Grundsätzlich kann man das Problem relativ e...

Weiterlesen
  1006 Aufrufe

Mails (nicht nur in Outlook) automatisch sortieren mit der Plus-Adressierung in Exchange Online

Seit Mai 2022 hat Exchange eine neue Funktion erhalten, die sich wunderbar verwenden lässt, um eingehende Newsletter-mails und ähnliches automatisch zu sortieren. Diese Funktion nennt sich Plus-Adressierung, weil man in die eigene Email-Adresse einfach ein + gefolgt von einem selbstgewählten Text erweitern kann, die dann ...

Weiterlesen
  1198 Aufrufe

Wenn die ISE nach dem Crash die geöffneten Skripte nicht mehr öffnet...

Die ISE, wenn auch nicht mehr der von Microsoft favorisierte Powershell-Editor, ist immer noch bei vielen Skriptern sehr beliebt, und das hat gute Gründe. Die ISE stellt z.B. die zuletzt geöffneten Skripte (und auch die nicht gespeicherten) wieder her, wenn es mal zu einem Absturz kommt oder die ISE vor dem Herunterfahren nicht ordentlich geschloss...

Weiterlesen
Markiert in:
  1065 Aufrufe

Wim-Files größer 4GB für Bootsticks aufteilen

Um einen Windows-Rechner per USB-Stick zu installieren, benötigt man prinzipiell nur das Media Creation Tool von Microsoft, das allerdings nur einen Installer für Windows 10 Home erstellt. Theoretisch kann man einfach mit dem Media Creation Tool den Bootstick erstellen und anschließend die Datei Install-Wim, in der sich die Installationsdateien bef...

Weiterlesen
Markiert in:
  2278 Aufrufe

Den Datentyp eines Registry-Eintrags mit Powershell ermitteln.

Die Registry ist technisch gesehen eigentliche ein Datenbank für Schlüssel-Wertepaare. Im Gegensatz zu Linux, wo jedes Programm sein eigene Konfiguration in einer Textdatei verwaltet, hat Microsoft die Konfigurationsverwaltung mit der Registry zentralisiert. Eine Besonderheit der Registry ist die Tatsache, dass jeder verwaltete Wert einen Date...

Weiterlesen
Markiert in:
  1385 Aufrufe

Powershell parallelisieren mit Runspaces

Runspaces mit Powershell Powershell Multithreading

Dieser Blogpost ist eine kurze Zusammenfassung von Powershell Runspaces am Beispiel eines Massenping. Ich fasse das Thema hier zusammen, weil Runspaces immer sehr mächtig und komplziert wirken, obwohl sie tatsächlich mit wenigen Zeilen Text beschrieben werden können. Das Problem: Ein Skript soll anhand einer bekannten Adresse (des Routers) herausfi...

Weiterlesen
Markiert in:
  6596 Aufrufe

eine sortierte Hashtable (Dictionary) als Powershell Parameter übergeben

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:

$Daten=[ordered]@{
   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:

$Daten=[ordered]@{
   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.

$Daten=[ordered]@{
   Pfad='C:\Windows'
   SvcUser='netz-weise\SqlSvc'
   Password='geheim'
}
FunctionTest-Hash
{
    param(
        [Hashtable]$Daten 
   
)
    $Daten
}
Test-Hash-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:

FunctionTest-Hash
{
    param(
        [System.Collections.Specialized.OrderedDictionary]$Daten 
   
)
    $Daten
}

Markiert in:
  3201 Aufrufe

Mit Powershell prüfen, ob eine Objekteigenschaft vorhanden ist

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.

Weiterlesen
Markiert in:
  5364 Aufrufe

Fehlende virtuelle Switche für Hyper-V VMs ermitteln und automatisch anlegen

Wenn eine virtuelle Maschine in Hyper-V von einem Host auf einen anderen per Import übertragen werden soll, müssen alle virtuellen Switche, an die die Maschine auf dem Quellhost angeschlossen war, auf dem Zielhost existierten. Existieren bedeutet in diesem Fall, dass ein Switch mit identischem Namen vorhanden sein muß. Ist das nicht der Fall, quittiert Hyper-V den Import mit einer Fehlermeldung:

Es ist ein Fehler beim Import aufgetreten
Der virtuelle Computer kann aufgrund von Konfigurationsfehlern nicht importiert werden. Verwenden Sie "Compare-VM", um den virtuellen Computer zu reparieren

Compare-VM ist ein Powershell-Kommando, dass zusammen mit dem Hyper-V Modul ausgeliefert wird, und das vor dem Import angewendet werden kann, um zu prüfen, ob es Probleme bei der Konfiguration gibt. Dafür pipen Sie das vmcx-File der virtuellen Maschine einfach in Compare-VM. Man erhält dann ein Rückgabeobjekt mit den Konfigurationsdetails der VM:

PS > Dir M:\Hyper-V\LON-AP1\Virtual Machines\4C9790D7-48CD-4D31-8BA2-02D8C9C245AE.vmcx | compare-VM

CheckpointPath     : M:\Hyper-V\LON-AP1\Snapshots
VM                 : VirtualMachine (Name = 'LON-AP1') [Id = '4c9790d7-48cd-4d31-8ba2-02d8c9c245ae']
OperationType      : ImportVirtualMachine
Destination        : R1WS3
Path               : M:\Hyper-V\LON-AP1\Virtual Machines\4C9790D7-48CD-4D31-8BA2-02D8C9C245AE.vmcx
SnapshotPath       : M:\Hyper-V\LON-AP1\Snapshots
VhdDestinationPath : M:\Hyper-V\LON-AP1\Virtual Hard Disks
VhdSourcePath      :
Incompatibilities  : {33012}

Weiterlesen
Markiert in:
  4322 Aufrufe

Eine MAC-Adresse unter Windows oder Windows PE auslesen und vereinheitlichen

Heute stand ich vor der Aufgabe, eine MAC-Adresse einzulesen. Das Einlesen der MAC-Adresse gestaltet sich dabei einfach. Unter Windows am einfachsten geht das über Get-Netadapter:

PS > Get-NetAdapter

Name         InterfaceDescription                ifIndex Status   MacAddress         LinkSpeed
----         --------------------                ------- ------   ----------         ---------
Internal     Microsoft Hyper-V Network Adapter        10 Up       00-15-5D-64-98-00  10 Gbps

Unter Windows PE steht das Cmdlet leider nicht zur Verfügung, da es zu den CDXML-Datei basierten Cmdlets gehört. Glücklicherweise kann man sich behelfen, indem man einfach auf Get-WMIObject zurückgreift:

PS > Get-WmiObject -Class win32_networkadapter

Weiterlesen
  4547 Aufrufe