Weisheiten - der Netz-Weise Blog

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

E-Mails in Office 365 kommen nicht an - Nachrichten aus der Quarantäne retten

spam Mails aus der Quarantäne holen
Wenn Mails bei Ihnen nicht ankommen, könnte die Mail im Spam-Ordner gelandet sein. Es gibt aber auch eine zweite Möglichkeit, die Sie in Outlook nicht nachverfolgen können. Neben dem Outlook-eigenen Spam gibt es nämlich auch weitere Spam-Einstellungen, die direkt im Mail-System (Exchange) eingerichtet und bereits vor der Zustellung ins Postfach ang...
Weiterlesen
25 Aufrufe
0 Kommentare

Kennwörter sicher speichern und abfragen mit Powershell

Schluessel Schlüssel sicher speichern in Powershell
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...
Weiterlesen
179 Aufrufe
0 Kommentare

Die Microsoft Data Protection API und Powershell

Sicher wie ein Safe Microsoft DPAPI sichert Ihre Anmeldeinformationen
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...
Weiterlesen
56 Aufrufe
0 Kommentare

Kennwörter sicher verwalten mit Keepass und Yubikey (MFA)

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...
Markiert in:
Weiterlesen
70 Aufrufe
0 Kommentare

Tastarlayout in Windows Server Core umstellen

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.

 

246 Aufrufe
0 Kommentare

Default Shell in Server Core auf Powershell ändern

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.

211 Aufrufe
0 Kommentare

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:
442 Aufrufe
0 Kommentare

Windows Update Troubleshooting

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
)

Markiert in:
Weiterlesen
635 Aufrufe
0 Kommentare

Email-Weiterleitungen von externen Konten auf Office 365 Verteiler einrichten (Anonymisieren)

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. 

Markiert in:
557 Aufrufe
0 Kommentare

Bitlocker-Verschlüsselung schlägt mit der Meldung "Das System kann die angegebene Datei nicht finden" fehl

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. 

916 Aufrufe
0 Kommentare

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.

Markiert in:
Weiterlesen
1772 Aufrufe
0 Kommentare

Den Datenträgertyp (SSD,HDD) per Powershell und WMI/CIM bestimmen

Um in einem Skript zwischen HDDs und SSDs zu unterscheiden, kann man seit Windows 8 auf das Cmdlet Get-PhysicalDisk zurückgreifen. Es liefert ein MSFT_PhysicalDisk-Objekt zurück, das unter https://docs.microsoft.com/en-us/previous-versions/windows/desktop/stormgmt/msft-physicaldisk beschrieben ist. Die Eigenschaft MediaType enthält den Datenträgertyp (HDD,SSD).

Das Cmdlet Get-Physicaldisk ist als CDXML-basiertes Cmdlet implementiert und fragt im Prinzip einfach nur die Klasse MSFT_PhyscialDisk ab. Das kann man auch direkt erledigen. 

Get-CimInstance MSFT_Physicaldisk -Namespace root\Microsoft\Windows\Storage

Wichtig - Die Klasse MSFT_PhysicalDisk befindet sich nicht im Standard-Namespace CimV2, daher ist es wichtig, den Namespace mit anzugeben. 

Warum sollte man die Klasse direkt abfragen? Z.B. wenn einem die Storage-Cmdlets nicht zur Verfügung stehen, oder wenn man nicht sicher weiß, ob die Cmdlets verfügbar sind. Außerdem kann man mit Get-CimClass die Abfrage auch direkt einschränken, was schneller geht als über Get-PhysicalDisk und Where-Object zu filtern:

Weiterlesen
2099 Aufrufe
0 Kommentare

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}

Markiert in:
Weiterlesen
1486 Aufrufe
0 Kommentare

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
1534 Aufrufe
0 Kommentare

Remote Desktop per Powershell Remote aus der Ferne aktivieren

Sie möchten sich auf einen Computer per RDP remote aufschalten, aber RDP ist nicht aktiviert? Kein Problem, solange der Computer per Powershell-Remoting erreichbar ist. RDP ist nämlich über einen einzigen Registry-Eintrag steuerbar. Er heißt fDenyTSConnections und gehört zum Schlüssel Hkey_Local_Machine\System\CurrentControlSet\Control\Terminal Server. Setzen Sie ihn auf 0, so werden RDP-Verbindungen nicht mehr blockiert. Die Einstellung wirkt sofort, ein Neustart ist nicht notwendig, allerdings blockiert die Windows Firewall den Port 3389 dann weiterhin. Es gibt eine Gruppe von Regeln mit dem sprechenden Namen "RemoteDesktop", die Sie aktivieren müssen, um die Ausnahmen für eingehende RDP-Verbindungen inklusive Remote-Unterstützung zu aktivieren. Das geht mit Powershell in zwei Zeilen:

$RdpKey = "Registry::Hkey_Local_Machine\System\CurrentControlSet\Control\Terminal Server"
Set-ItemProperty -Path $RDPKey -Name "fDenyTSConnections" –Value 0
Enable-NetFirewallRule -DisplayGroup "RemoteDesktop"

Ja, Sie haben natürlich Recht, das sind 3 Zeilen, aber nur, um den Code hier ein wenig übersichtlicher darstellen zu können. ;-)

Wenn Sie am betroffenen Rechner sitzen, können Sie das natürlich auch von Hand machen. Sitzen Sie nicht an der betreffenden Maschine, aber Powershell-Remoting ist aktiviert (ab allen Servern ab 2012 Standard), können Sie das aber per Invoke-Command auch aus der Ferne erledigen. Das kann man natürlich auch wieder ein eine Funktion packen und in ein Modul speichern. Als einfache Funktion könnte das so aussehen - auch gleich mit Unterstützung für SSL.

Function Enable-RemoteDesktop
{
param(
  [String]$computername,

Markiert in:
Weiterlesen
2600 Aufrufe
0 Kommentare

Binärdaten in der Registry speichern mit Powershell

In den letzten beiden Artikeln habe ich gezeigt, wie man mit Powershell Binärdaten einlesen kann. Die eingelesenen Daten können auch in der Registry gespeichert werden, und zwar direkt binär oder Base64-codiert als String. Diese Beispiele stammen aus einem Webcast, den ich für die Firmat Netwrix unter dem Titel "Die Windows Registry als Angriffsvektor" am 2. Mai gehalten habe. Die Aufzeichnung kann man unter https://www.netwrix.com/webinars.html#featured anschauen. 

Um Daten direkt im Binärformat zu speichern, legen Sie einen neuen Registry-Wert mit dem Cmdlet New-Itemproperty an. Der Schlüssel (Ordner), in dem der Wert erzeugt werden soll, muß dafür existieren.

$FindExe = Get-Content -Path C:\Windows\System32\find.exe -Encoding Byte -Raw
$RegKey = New-Item -Path Registry::Hkey_local_machine\SOFTWARE -Name NetzWeise
New-ItemProperty -Path $RegKey.PSPath -Name Find -Value $FindExe -PropertyType Binary

Um die Datei wieder als Exe-Datei zu speichern, lesen Sie den Schlüssel einfach aus. 

$FindBinaryData = (Get-ItemProperty -Path Registry::Hkey_Current_User\SOFTWARE\NetzWeise -Name Find).Find
Set-Content -Value $FindExe -Path c:\temp\find.exe -Encoding Byte

Markiert in:
Weiterlesen
1415 Aufrufe
0 Kommentare

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:

Markiert in:
Weiterlesen
1741 Aufrufe
0 Kommentare

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. 

Markiert in:
Weiterlesen
1466 Aufrufe
0 Kommentare

Virtuelle Festplatten (vhdx) als Datencontainer verwenden - nicht nur für VMs

Virtuelle Festplatten (Vhdx-Dateien) in Windows sind sehr praktisch. Man kann Sie nämlich nicht nur für virtuelle Maschinen verwenden, sondern auch als universelles Containerformat, um Daten zu transportieren oder sogar, um Windows aus einer VHD-Datei zu booten (s. https://www.netz-weise-it.training/weisheiten/tipps/item/377-boot-von-vhd-auf-einem-leeren-datentraeger-einrichten.html). Das Erstellen einer VHD-Datei ist allerdings etwas mühselig, weil man erst die Datei erstellen, dann einrichten und anschließend eine Partition erstellen muss. Da man das aber auch mit Powershell erledigen kann, und ich dieses Feature sehr oft verwende, habe ich eine kleine Funktion dafür geschrieben. 

#requires -Modules Hyper-V, Storage -RunAsAdministrator

function Get-Freedrive
{
<#
  .SYNOPSIS
  Get-Freedrives lists the first free driveletter in the alphabet.
  .DESCRIPTION 
  Get-Freedrive can be used to test for the first available free driveletter. The Parameter $inverse searches backwards through the alphabet.
  .EXAMPLE
  get-freedrive -inverse -startLetter Z
  Starts the search with letter z searching backwards. Returns a character.
  .NOTES
  Version: 1.0
  Author: Holger Voges
  Date: 2018-08-17
  www.netz-weise-it.training/weisheiten/
#>

[cmdletbinding()]
param(
  # The letter to start the search from - default is C or Z, if -inverse is chosen
  [char]$startLetter = 'C',

  # Inverse forces a backwards search through the alphabet
  [switch]$inverse

Weiterlesen
1548 Aufrufe
0 Kommentare

Powershell-Skriptmodule erstellen

Ein extrem cooles Features sind die in Powershell 2.0 eingeführten Module. Module sind Erweiterungen, die in Powershell geladen werden und weitere Cmdlets zur Verfügung stellen. Ab Powershell 3.0 können über das Modul-Autoloading Module sogar ohne weiteres zutun des Benutzers beim Starten einer Powershell automatisch geladen werden. 

Module gibt es in Form von Binärmodulen, die z.B. in C# geschrieben werden, und in Form von sogenanten Skriptmodulen. Ein Skriptmodul ist dabei eigentlich nichts anderes als ein Powershell-Skript, dass global aufgerufen wird und im Normalfall Funktionen enthält, die dann wie Cmdlets gestartet werden können. Funktionen verhalten sich dabei wie ein Skript, dass überall in der Powershell-Konsole mit über den Namen aufgerufen werden kann, ohne dass man sich im Skriptpfad befinden müsste, da die Funktionen direkt in den Arbeitsspeicher geladen und von dort aus gestartet werden. 

Ein Skriptmodule zu erstellen, ist sehr einfach und braucht auch keine erweiterten Powershell-Kenntnisse. Prinzipiell kann jedes beliebige Powershell-Skript wie ein Module verwendet werden, indem man es einfach über das Cmdlet Import-Module <Skriptdatei> startet. Sinniger ist es aber, das Skript als automatisch ladendes Skript abzulegen. Dazu muß die Skriptdatei in einem der Module-Ordner abgelegt werden, die von Powershell automatisch beim Starten geprüft werden. Welche Ordner Module-Ordner sind, legt dabei die Umgebungsvariable PSModulePath fest. Sie können die Modulorder in Powershell dabei übersichtlich anzeigen lassen, indem Sie sich mit der String-Methode Split() den String in seine Einzelpfade aufsplitten lassen. Geben Sie dafür folgende Codezeile in und bestätigen Sie mit Enter:

$env:psModulePath.split(";")
C:\Users\admin.NETZ-WEISE\Documents\WindowsPowerShell\Modules
C:\Program Files\WindowsPowerShell\Modules
C:\Windows\system32\WindowsPowerShell\v1.0\Modules

Wie Sie im Beispiel sehen können, verwendet Powershell standardmäßig drei Modul-Pfade - einen für Windows-eigene Module im Powershell-Ordner, einen für Nicht-Windows-Module unter "Program Files" und einen benutzerspezifischen im Dokumente-Ordner des Benutzers. Sie können Ihre eigenen Skripte als Module unter "Program Files" oder unter Documents ablegen, wenn das Module nur für den Benutzer zur Verfügung stehen soll. Legen Sie hierfür im Module-Ordner einen neuen Unterordner an, und speichern Sie Ihr Skript innerhalb dieses Ordners mit der Endung .psm1. Sie können als Beispiel die Funktion Replace-SharePath aus dem Tipp Windows Freigaben auf einen neuen Pfad migrieren verwenden. Als Dateinamen verwenden Sie den gleichen Namen wie für den Ordner. Das Modul "KleineHelfer" muß also als "%ProgramFiles%\WindowsPowershell\Modules\KleineHelfer\KleineHelfer.psm1" gepeichert werden. Beim Start der nächsten Powershell-Konsole wird Ihr Modul automatisch geladen. Ist das nicht der Fall, können Sie die Fehlermeldung erzwingen, indem Sie das Modul von Hand mit dem Parameter -force laden:

Markiert in:
Weiterlesen
1779 Aufrufe
0 Kommentare
Nach oben