Zum Hauptinhalt springen

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 sogenannten 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:

Continue reading
Tags:
  5427 Hits

Der „Key-Trick“: Hardware-KVM-Switches per Tastatur steuern

Das Ende der Schreibtisch-Gymnastik Jeder, der zwei PCs an einem Arbeitsplatz nutzt, kennt das Gerät: Der KVM-Switch (Keyboard, Video, Mouse). Meistens klebt er unter dem Schreibtisch oder versteckt sich hinter dem Monitor. Das Problem? Das manuelle Drücken der physischen Taste stört den Workflow. Was viele nicht wissen: Fast jeder moderne KVM-Swit...

Continue reading
  178 Hits

Monitor-Umschaltung per Script - DDC/CI statt Hardware-KVM

Warum teure Hardware kaufen, wenn das Protokoll gratis ist?

Warum sollte man 100 € für einen DisplayPort-KVM ausgeben, der das Bildsignal oft verschlechtert, wenn der Monitor selbst mehrere Eingänge hat? Die Lösung heißt DDC/CI (Display Data Channel). Damit lässt sich der Monitor direkt vom Betriebssystem aus steuern – ganz ohne Knöpfe am Gehäuse.

Schritt 1: Identifikation per Seriennummer

In einem Multi-Monitor-Setup ist Präzision Pflicht. Wir nutzen die Seriennummer (z. B. deines Dell U2717D), damit nur der korrekte Monitor umschaltet.

Windows: ControlMyMonitor (NirSoft - ControlMyMonitor)

Mit diesem Tool lesen wir die VCP-Codes aus. Zuerst müssen wir unseren Monitor auswählen (1.) und anschließend den Code für dieEingangsquelle (2.) finden.

Der Code für die Eingangsquelle ist fast immer die 60.

Anschließend können wir die möglichen Werte sehen, die zu den Eingangsquellen gehören:;

Continue reading
  6 Hits

Gruppenrichtlinien Einstellungen (Preferences) Logging aktivieren

Gruppenrichtlinien Einstellungen oder Group Policy Preferences haben ein Logging-Feature, mit dem man sehr genau überprüfen kann, was beim Einloggen des Benutzers passiert.

Die Group Policy Preferences oder Einstellungen, wie es schlecht übersetzt im deutschen heißt, sind ein sehr mächtiges Feature, das ab Windows Vista standardmässig mitgeliefert wurde, um eine Alternative zu Login-Scripten zu lieferen. Die Einstellungen bieten sehr viele Möglichkeiten, wie z.B. das Targetting, um festzulegen, welcher Benutzer von einer Richtlinie betroffen sein soll. Wenn es allerdings zu unerwartetem Verhalten kommt, ist guter Rat erst mal teuer, denn die Voreinstellungen haben viele mögliche Fehlerquellen. Zum Glück kann man das Logging aktivieren.

Das Logging teilt sich in ein Event-Log basiertes Logging und ein erweitertes, Textdateibasiertes Tracing auf und wird für jede Komponente (Client Side Extension, CSE) einzeln aktiviert. Dies geschieht - natürlich - in einer Gruppenrichtlinie. Die Einstellungen finden Sie unter Computereinstellungen > Administrative Vorlagen > System > Group Policy > Logging and tracing. Hier haben Sie für jede CSE die Möglichkeit, die Konfiguration des Event-Loggins zu ändern - standardmässig werden Fehler und Warnings im Eventlog protokolliert - oder das Dateibasierte Tracing zu aktivieren.

Unter Event-Logging legen Sie fest, welche Informationen im Event-Log gespeichert werden sollen. Die von den Preferences erzeugen Logs werden im Anwendung-Log gespeichert! Mehr Informationen zu den Log-Einträgen für Preferences finden Sie in der Knowledge-Base.

Um ein erweitertes Log-File zu erzeugen, müssen Sie das Tracing aktivieren. Die Systemvariable %COMMONAPPDATA% ist eine Variable, die von den Preferences gesetzt wird (keine echte Umgebungsvariable) und verweist auf den Ordner ProgamData. Achten Sie darauf, dass dieser Ordner erst mit Vista angelegt wurde! Im Beispiel habe ich das Logging für das User-Laufwerksmapping aktiviert und anschließend ein Laufwerksmapping über die Group Policy Preferences aktiviert. Das erzeugte Trace-File finden Sie unten zum Download.

  6846 Hits

Windows Server 2016 Startmenü findet keine Programm

Wie man viele Probleme mit dem Windows 10 Startmenü lösen kann, habe ich im Artikel "Suchen im Windows 10 Startmenü findet keine installierten Programme" bereits beschrieben. Leider tritt ein ähnliches Problem auch bei Windows Server 2016 auf, was das Startmenü ziemlich ad-absurdum führt. Mein erster Tipp hierzu: Verwenden Sie die Kachelanzeige, um häufig verwendete Programm einfach zu hinterlegen. 

Das eigentliche Problem der Suche im Startmenü unter Windows Server 2016 besteht darin, dass das Startmenü in Windows jetzt als Datenbank implementiert ist. Die Programme im Menü werden indexiert und in der Datenbank abgelegt. Der Zugriff findet dann über Cortana statt. Auf dem Windows Server 2016 hat Microsoft aber den Suchdienst deaktiviert, der die Suche durch die Datenbank erst ermöglicht. Nach langem Recherchieren habe ich einen Thread gefunden, der das Problem und die Lösung beschreibt. beschreibt. Ein Microsoft-Mitarbeiter hierzu:

The “Windows Search” service is set to ‘Disabled’ by default on Windows Server 2016. This is because indexing of the volumes can negatively impact / break server scenarios, such as Cluster Shared Volumes (CSV) and running Remote Desktop Session Host (RDSH) with multiple simultaneous sessions. The side effect of the Windows Search service being disabled is that using Cortana with Start Menu searches has a degraded experience.

Windows Server is optimized to ensure server scenarios are rock solid, which may include trade-off's over shell user experience. If you plan to use Windows Server 2016 as your client desktop machine, you could re-enable the Windows Search service.

Sie können das Problem mit dem Startmenü also einfach beheben, indem Sie die Dienstkonfiguration gehen und den Suchdienst starten oder einfach folgendes Powershell-Kommando verwenden:

Continue reading
  15898 Hits

Office automatisch aktivieren

Office 2010 kann man automatisch installieren, indem man einen administrativen Installationspunkt erzeugt und dann ein msp-Paket erzeugt. Im msp-Paket kann man auch festlegen, dass Office 2010 beim ersten Start eine automatische Aktivierung durchführt. Dafür legen Sie im Menüpunkt Setup-Properties eine neue Eigenschaft "AUTO_ACTIVATE" mit dem Wert 1 an. Achten Sie darauf, dass die Auto-Aktivierung nur 1 mal durchgeführt wird! Wenn Sie also die Auto-Aktivierung testen, indem Sie z.B. Word starten, und Windows dann per Sysprep zurücksetzen, wird beim ersten Start von Office wieder ein Aktivierungsfenster gestartet!

Links:

How to install Office 2010 with a MAK key and have it perform an automatic activation attempt after install (Part Deux)

 

  4252 Hits

Mit Powershell Reg_Binary Werte in die Registry schreiben

Wie Sie mit der Powershell Reg-Binary Werte in die Registry schreiben Powershell bietet ein mächtiges Kommando zum setzen von Registry-Werten: SET-ITEMPROPERTY bzw. NEW-ITEMPROPERTY. Mit Set können Sie einen bestehenden Wert überschreiben, mit New erzeugen Sie einen neuen Wert. Die Syntax ist grundstätzlich sehr simpel:

New-Itemproperty -Path "Registrierungsschlüssel" -name "Name des Werts"  -Value "Zu setzender Wert" -PropertyType "Typ des Eintrags"

Als Propertytype kommen dabei in Frage:

  • BINARY
  • DWORD
  • STIRNG
  • EXPANDSTRING
  • MULTISTRING
  • QWORD

Die meisten der Werte sind einfach zu setzen, allerdings erweist sich Binary  mitunter als widerspenstig. Wird als PropertyType "BINARY" angegeben, so muß der angegebene Wert sich auch im Binärdatentyp befinden. Eine Umwandlung kann dabei über die Konvertierungsfunktion [BINARY] erfolgen. Ein wenig trickreich wird es, wenn man Daten z.B. aus einem Regfile ausliest, weil beim Registrierungsepxort die Daten nicht als Binärdaten ausgegeben werden, sondern als HEX-Zahlen. Diese müssen vorher erst wieder ins Dezimalformat umgewandelt werden, bevor man sie ins Binärformat konvertieren kann. Eine mögliche Lösung sieht so aus:

New-ItemProperty -Path 'HKCU:\Software\' -name "EinWert"  -Value (&{'c7,02,00,00'.split(",") | %{"0x"+$_}}) -PropertyType BINARY}

Kurze Erklärung: Die Hex-Werte werden in einem Script-Block aufgesplittet und per String-Addition für Powershell in einen Hex-Wert gewandelt. Diesen kann Powershell dann implizit konvertieren. Weitere Informationen zur Konvertierung finden Sie in unserem vorigen Tipp.

  9202 Hits

Datenbanken migrieren von mySQL zu SQL-Server

SQL-Server und mySql sind leider SQL-seitig nicht wirklich kompatibel. So gibt es zwar die Möglichkeit, eine Datenbank in mySQL als Script zu exportieren, aber leider kann man das Script auf dem SQL-Server nicht mehr für den Import benutzen. Der beste Weg für den Import führt daher über den SQL Server Migration Wizard. Der Migration Wizard steht für verschiedene Datenbanken zur Verfügung und hilft z.B. auch bei der Migration von Access-Datenbanken zu SQL-Server. Da das Tool recht komplex ist, möchte ich hier nur kurz zeigen, wie man eine einfach Migration durchführt, ohne auf die schmutzigen kleinen Details des Tools eingehen zu wollen. Ich verwende hierzu die derzeit aktuelle Version 6.0.1, 6.1 (für SQL-Server 2016) ist derzeit in der Beta-Phase.

Sie benötigen auf dem Rechner, auf dem Sie den SSMA einrichten wollen, zuerst einmal einen mySQL-ODBC-Treiber. Haben Sie die mySQL-Datenbank unter Windows auf dem gleichen Rechner installiert, dann müssen Sie nichts weiter machen, denn mySQL installiert den passenden ODBC-Treiber gleich mit. Ansonsten laden Sie den Treiber einfach bei mysql.com herunter. Nutzen Sie den 64-Bit Treiber, der SSMA wird nämlich auch in einer 64-Bit-Version installiert. Eine Konto für die Authentifizierung ist übrigens nicht notwendig, klicken Sie einfach auf den Link "No thanks, just start my download", wenn Sie nach Ihrem Login gefragt werden. Anschliessend installieren Sie den SSMA.

Wenn Sie den Migration Assistenten zum ersten Mal starten, müssen Sie ein Migrationsprojekt erstellen. Wählen Sie hierfür im Menü File "New Project" aus. Wichtig ist, dass Sie im folgenden Fenster das Migrationsziel auswählen. Standardmässig ist hier Azure angegeben. Leider können Sie das Ziel im Projekt selber dann nicht mehr ändern. Das kann ziemlich verwirrend sein!

Nun müssen Sie eine Verbindung zum Quell- und zum Zielsystem herstellen. Wählen Sie hierfür in der Toolbar zuerst "Connect to MySql". Wählen Sie im Verbindungsfenster den Provider aus - dies ist der ODBC-Treiber, den Sie installiert haben. Ist hier kein Treiber sichtbar, obwohl Sie einen Treiber installiert haben, dann prüfen Sie, ob Sie den Treiber und SSMA beide in der gleichen Version (32-Bit / 64-Bit) installiert bzw. gestartet haben. Außerdem benötigen Sie den Namen des Quellservers, den mySQL-Port (standardmässig 3306), sowie ein Konto mit Leserechten auf dem mySQL-System. 

Nun verbinden Sie sich mit dem SQL-Server. 

Continue reading
  7610 Hits

Windows Profile Betriebssystemunabhängig mit UE-V

"Benutzerprofile verwalten - augenblicklich und Betriebssystemversionst-unabhängig - ist das möglich? Ja, mit UE-V!

UE-V (eine kurzform von Microsoft User Experience Virtualization) ist eine Funktion, um Windows Benutzerprofile zu verwalten. Vor kurzem haben wir darüber geschrieben, wie man servergespeicherte Benutzerprofile verwalten kann, wenn man 2 verschiedene Windows-Versionen unterstützen muß. Normalerweise muß man dafür 2 verschiedene Benutzerprofile hinterlegen und die entsprechenden Benutzerordner wie Desktop, Eigene Dateien usw. aus dem Benutzerprofil ""herausziehen"" und auf einer Netzwerkfreigabe speichern. Mit Windows UE-V wird das Benutzerprofil (die Benutzereinstellungen, nicht die Dateien, die ziehen wir weiterhin aus dem Profil heraus) über einen eigenen Dienst verwaltet. Der UE-V Dienst überwacht die Registry und den App-Folder im Benutzerprofil und synchronisiert Änderungen an Anwendungseinstellungen auf ein Netzwerklaufwerk (Share). Diese Änderungen werden nach dem Beenden der Anwendung direkt gespeichert, so dass ein Abmelden zum Synchronisieren der Benutzereinstellungen nicht mehr notwendig ist. Auch Modern Apps (Windows 8 Apps) werden mit UE-V 2.0 unterstützt. Out of the Box bringt UE-V die Unterstützung diverser Anwendungen mit. Für Anwendungen, die nicht von UE-V unterstützt werden, können eigene XML-Konfigurationsdateien mit Hilfe eines mitgelieferten Tools erstellt werden. Das tolle an UE-V ist, dass nicht alle Einstellungen zwischen den Clients eines Rechners synchronisiert werden. Dadurch kann man die Benutzerprofile auch zwischen unterschiedliche Betriebssytemen ohne Verrenkungen verwalten. So, wo ist jetzt der Nachteil des UE-V? Es ist nur als Bestandteil des Desktop Optimization Kits zu bekommen (M-DOP). Warum nur, Microsoft, warum? Verdient ihr mit dem MDOP tatsächlich so viel Geld, dass es sich lohnt, diese Programme nicht zum Bestandteil des Betriebssystems zu machen?"

  3976 Hits

Die Existenz einer OU testen mit Powershell

Leider bietet das Powershell AD-Modul keine Möglichkeit, auf das Vorhandensein einer Organizational Unit zu testen. Diese Funktion lässt sich aber einfach nachrüsten. 

Grundsätzlich kann man die Existenz einer OU testen, indem man einfach das Cmdlet Get-OrganizationalUnit verwendet. Prüft man die Abfrage in einer IF-Bedingung, wird der Scriptblock des IF ausgeführt, wenn die OU existiert. Das Ganze hat allerdings einen Haken, denn Get-ADOrganizationalUnit bricht die Skriptverarbeitung mit einem unbehandelten Fehler ab, wenn die OU nicht existiert.

If ( Get-ADOrganizationalUnit -Identity "OU=test,DC=Netz-Weise,DC=DE" ) { $true }
get-adorganizationalUnit : Directory object not found

Dieses Verhalten kann man sich zunutze machen, indem man die Ausführung des Get-ADOrganizationalUnit mit Try-Catch ausführt. Wird ein unbehandelter Fehler ausgeführt, wird die Catch-Block aufgerufen und ausgeführt. In diesem muß man jetzt nur noch einen $False zurück liefern. 

function Test-ADOrganizationalUnit

Continue reading
  7944 Hits

Zertifikate mit Powershell inklusive des privaten Schlüssels als pfx-Datei exportieren

Im letzten Tipp habe ich gezeigt, wie man Zertifikate mit Powershell Base64-kodiert aus dem Zertifikatsspeicher exportieren kann. Wenn man versucht, mit dem Cmdlet Export-Certificate eine pfx-Datei zu erstellen, - die pfx-Datei ist ein Container, der neben dem Zertifikat auch den privaten Schlüssel enthält und tatsächlich eigentlich das PKCS #12-Formate enthält - stellt man allerdings fest, dass das Cmdlet dazu nicht in der Lage ist. Tatsächlich ist es aber kein Problem - man muß nur das richtige Cmdlet verwenden. Denn zum Export als .pfx-Datei verwendet man Export-PFXCertificate. Die Datei muß allerdings mit einem Kennwort gesichert werden, um den privaten Schlüssel zu  sichern:

$pwd = ConvertTo-SecureString -String "geheim" -AsPlainText -Force

Get-ChildItem -Path Cert:\CurrentUser\My\ | Where-Object { $_.subject -eq "cn=NWCertRoot" } |

    Export-PfxCertificate -FilePath $home\NwcertRoot.pfx -Password $pwd 

 

Continue reading
  7306 Hits

DHCP-Proxy, WDS-Server, DHCP-Option 60,66 und 67 und was das mit PXE-Boot zu tun hat

Über wenig Dinge liest man so viel falsches wie über den PXE-Netzwerkboot und wie man den DHCP-Server korrekt konfigurieren muss, um einen Computer aus dem Netzwerk zu starten. Für die ungeduldigen hier zuerst die Konfiguration, die Erklärung folgt danach.

Richten Sie einen DHCP-Server ein. Installieren Sie den WDS-Server auf dem DHCP-Server und lassen Sie den WDS-Server die Konfigurationsarbeit auf dem DHCP-Server erledigen. Der WDS-Server wird dann auf dem DHCP-Server selbständig die Option 60 (PXE-Client) setzen. Wenn Sie den WDS-Server auf einem separaten Server installieren, müssen Sie _NICHTS_ weiter tun. Sie müssen auf dem DHCP-Server weder die Option 60 setzen, noch die Option 66 (TFPT-Server) und 67 (Bootfile). Wenn der WDS-Server und die zu installierenden Clients sich nicht im gleichen Netz befinden, muß der WDS-Server allerdings wie ein DHCP-Server im DHCP-Relay-Agent oder bei Cisco als IP-Helper konfiguiert sein. Der Client findet den WDS-Server dann von selbst und bootet aus dem Netzwerk. Tut er das nicht, liegt es nicht an den DHCP-Optionen!

Was genau passiert beim DHCP-Boot?

Wenn Sie einen Computer über das Netzwerk booten möchten, benötigen Sie einen DHCP-Server und einen TFPT-Server. TFPT ist das Trivial File Transfer Protocol, das im Gegensatz zu FTP Daten per UDP überträgt und ohne Authentifizierung funktioniert. Wenn ein Client einen PXE-Boot initialisiert, schickt er einen DHCP-Request ins Netzwerk, zusammen mit der Information, dass er per PXE booten möchten. Der DHCP-Request wird, wenn er einen DHCP-Server erreicht, mit einem DHCP-Offer beantwortet. Die Antwort beinhaltet die angebotene IP-Adresse, sowie weitere DHCP-Optionen. Prinzipiell kann der DHCP-Server über die Option 66 und 67 dem Client auch einen Bootserver sowie ein Bootfile mitschicken, und das wird auch funktionieren, ist aber nicht notwendig und verursacht zusätzlichen Konfigurationsaufwand. Denn der WDS-Server fungiert als DHCP-Proxy. Das bedeutet, dass er die Anfrage des PXE-Clients ebenfalls beanwortet, allerdings schickt er keine IP-Adresse zurück, sondern nur die Option 66 und 67 mit den Bootfiles, die er zur Verfügung stellt. Das Bootfile ermittelt er selbständig aus seiner Konfiguration. Wichtig ist nur, dass der DHCP-Request beim WDS-Server ankommt. Da der DHCP-Request als Broadcast vom Client verschickt wird, muß die Anfrage also, sofern der WDS-Server nicht im gleichen Netzwerk steht wie der Client, ein DHCP-Weiterleitungsdienst wie der IP-Helper auf dem Router das Datenpaket per Unicast an den WDS-Server weiterleiten. Der WDS wird also genauso auf dem IP-Helper eingetragen wie der DHCP-Server selbst.
Die Option 60, die der WDS-Server bei einer gleichzeitigen Installation im IP-Scope des DHCP-Servers setzt, hat eine andere Funktion. Der DHCP-Proxy funktioniert nämlich wie der DHCP-Server und nutzt auch den gleichen Port ( UDP 67). Wenn der WDS und der DHCP auf dem gleichen Server laufen, muß der WDS-Server einen anderen Port verwenden. Er verwendet dann UDP-Port 4011. Damit der Client auch auf Port 4011 hört und die Konfiguration des DHCP-Proxys akzeptiert, wird die Option 60 vom DHCP-Server gesetzt.

Sollte Ihr Client trotz allem nicht vom WDS-Server booten, kann diese eine andere Ursache haben.  Lesen Sie dafür auch den Artikel "Der PXE-Client startet nicht von WDS-Server - No UEFI-compatible file system found"

Continue reading
Tags:
  38686 Hits

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.

  4290 Hits

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. Boot von VHD auf einem leeren Datenträger einrichten). 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

Continue reading
  4762 Hits

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:

Continue reading
  5828 Hits

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

Continue reading
  4547 Hits

Die Fenster-Rahmen bei Windows wieder einblenden

Seit Windows Server 2019 und Windows 10 werden Fensterrahmen nicht mehr angezeigt. Diese Designentscheidung finde ich schon aus ästhetischen Gründen fragwürdig, aus ergonomischer Sicht ist es jedenfalls völlig daneben, da man, wenn man mehrere Fenster übereinander legt, die Fenster kaum noch zu unterscheiden sind. Glücklicherweise gibt es...

Continue reading
  6735 Hits

Zufällige (Komplexe) Kennwörter erzeugen mit Powershell

Update: Eine Version mit Hilfe des .NET-Frameworks finden Sie im Artikel Sichere Kennwörter in Powershell generieren, jetzt mit dem .NET Framework

Kennwörter braucht man in Skripten an allen Ecken und Enden, speziell dann, wenn man Benutzer erstellen möchten. Bei einer größeren Anzahl von Konten kann da ein Skript ganz hilfreich sein, dass zufällige Kennwörter generiert. Das ist mit Powershell relativ einfach gemacht. Alles, was man benötigt, ist eine Funktionalität zum Erstellen von Zufallswerten und die Möglichkeit, Zahlen in Buchstaben umzuwandeln. Das Cmdlet Get-Random liefert Zufallszahlen zurück:

Get-Random -Min 10 -Max 100

Die vollständige Auflistung der Funktionen Get-Random können Sie in der Powershell-Hilfe nachlesen. Für uns interessant ist der Parameter -Inputobject, über den man Get-Random ein Array mit Werten übergeben kann, aus denen der Zielwert gewählt wird. 

$ZufallsListe = 65..90
$Zufallszahl = Get-Random -InputObject $Zufallsliste

Continue reading
  5743 Hits

Sichere Kennwörter in Powershell generieren, jetzt mit dem .NET Framework

In meinem Blogeintrag Zufällige (Komplexe) Kennwörter erzeugen mit Powershell vom 23.04 habe ich gezeigt, wie man komplexe Kennwörter mit Powershell generieren kann, indem man zufällige Zeichen mit Get-Random erzeugt. Aber es geht auch einfacher, denn das .NET-Framework bietet bereits eine fertige statische Methode zum generieren von Kennwörtern, die man in Powershell nur noch laden muß. Die Methode heißt GeneratePassword und befindet sich in der [System.Web]-Assembly. Die Assembly ist in Powershell allerdings nicht standardmäßig geladen. Dies kann man mit dem Cmdlet Add-Type erledigen: 

Add-Type -AssemblyName System.web

Nun können Sie die Methode GeneratePassword aus der Klasse [System.Web.Security.Membership] aufrufen. Der Aufruf erfolgt über [Klasse]::Methodenname(Parameter):

[System.Web.Security.Membership]::GeneratePassword(10,3)

Die beiden Parameter 10 und 3 bestimmen die Anzahl der Zeichen sowie die nicht-Alphanumerischen Zeichen, die das Kennwort enthalten muß. 

Continue reading
Tags:
  6022 Hits

Tastaturlayout 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.

 

  6550 Hits