13.01.2024

Windows PowerShell

PowerShell allgemein
Hilfe verwenden
Formatierung, Datenaufbereitung und Ausgabe/Export
Prozessverwaltung
Powershell Variable
Netzwerk
Windows Server Verwaltung
Hyper-V Verwaltung
Domain Benutzer/Gruppen Management
Internet Explorer
Powershell Scripte
Mailversand per Powershell
sonstiges

Technet Windows PowerShell
Windows PowerShell - Cmdlet-Hilfethemen

MS PowerShell Forum
Powershell AG Forum

Seitenanfang

PowerShell allgemein

ModulManagement der PowerShell
Ausführungsrichtlinien für PowershellScripte

Der Start der PowerShell erfolgt über das Startmenü unter Programme | Zubehör | Windows PowerShell | Windows PowerShell oder Windows PowerShell ISE, oder über Ausführen / Eingabeaufforderung

PowerShell ISE kann ab Windows 8 / Server 2012 durch Rechtsklick auf das angeheftete Symbol in der TaskLeiste gestartet werden.

- normale PowerShell

powershell

- PowerShell ISE (Integrated Scripting Environment)

powershell_ise

- verfügbare Parameter anzeigen

powershell -?
Seitenanfang

ModulManagement der PowerShell

- alle verfügbaren Module der PowerShell anzeigen

Get-Module -ListAvailable

- nur angegebene Module laden

Import-Module <Modulname>
Import-Module Servermanager

- alle verfügbaren Module der PowerShell laden

Get-Module -ListAvailable | Import-Module
Seitenanfang

Ausführungsrichtlinien für PowershellScripte

Get-ExecutionPolicy
Set-ExecutionPolicy

- aktuelle Ausführungsrichtlinien anzeigen

Get-ExecutionPolicy -List
        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy       Undefined
   UserPolicy       Undefined
      Process       Undefined
  CurrentUser       Undefined
 LocalMachine    RemoteSigned

- PowerShell-Skripts Ausführungsrichtlinien bearbeiten, wenn Scripte nicht ausgeführt werden dürfen. TN Artikel

Fehlermeldung: GetProductKey : Path zum Script\script.ps1" kann nicht geladen werden, da die Ausführung von Skripts auf diesem System deaktiviert ist. Weitere Informationen finden Sie unter "about_Execution_Policies"

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope LocalMachine

Standard Einstellung: Restricted

Set-ExecutionPolicy Restricted
ExecutionPolicy Beschreibung
Unrestricted (Uneingeschränkt) Alle Konfigurationsdateien werden geladen, und alle Skripts werden ausgeführt. Wenn Sie ein nicht signiertes Skript ausführen möchten, das aus dem Internet heruntergeladen wurde, werden Sie vor der Ausführung zur Genehmigung aufgefordert
RemoteSigned (Remote signiert) Heruntergeladene Skripts müssen von einem vertrauenswürdigen Autor signiert werden, bevor sie ausgeführt werden können
AllSigned (Vollständig signiert) Nur von einem vertrauenswürdigen Autor erstellte Skripts können ausgeführt werden
Restricted (Eingeschränkt) Es können keine Skripts ausgeführt werden. Windows PowerShell kann nur im interaktiven Modus genutzt werden
Default setzt die Einstellung auf Standard zurück (Restricted)
Bypass (Uneingeschränkt) Keine Blockierung findet statt, und es werden keine Warnungen oder Eingabeaufforderungen ausgegeben.
Undefined Entfernt die gerade zugewiesene Ausführungsrichtlinie aus dem aktuellen Bereich. Mit diesem Parameter wird keine Ausführungsrichtlinie entfernt, die in einem Gruppenrichtlinienbereich festgelegt wurde
Seitenanfang

Hilfe verwenden

Befehl Erklärung
help oder help <Befehl> allgemeine Hilfe, Erläuterung zum angegebenen Befehl
Get-Help oder Get-Help <Befehl> allgemeine Hilfe, Erläuterung zum angegebenen Befehl
Get-Help <Befehl> -ShowWindow ab PS 3.0 - startet ein eigenständiges Hilfefenster
Get-Help <Befehl> -Online ab PS 3.0 - OnlineHilfe im Standardbrowser wird gestartet
Update-Help ab PS 3.0 - Hilfedateien werden Online aktualisiert, diese sind für die Standardmodule unter C:\Windows\System32\WindowsPowerShell (Aktualisierung nur mit Adminrechten möglich)
get-help <Befehl> -examples Beispiele des Befehls anzeigen
Show-Command <Befehl> ab PS 3.0 - Abfrage interaktiv zusammenstellen, Pflichtparameter mit * gekennzeichnet
   
<Befehl1> | <Befehl2> | <Befehl3> Befehle verbinden, die Ausgabe des ersten ist Eingabe für den zweiten Befehl usw.
Get-Alias | ft -AutoSize Liste der definierten Aliase
Get-History zeigt letzten 32 eingegebenen Befehle (Alias: History, ghy, h)
Get-Host Powershell Version anzeigen
$PSVersionTable Powershell Version anzeigen
$Host.Version Powershell Version anzeigen

Beispiele

- detailierte Hilfe

Get-Help <Befehl> -Detailed

- detailierte Hilfe

Get-Help <Befehl> -examples

- Liste von Hilfsartikeln (bis PS 2.0)

Get-Help about_*

- Artikel über Aliase anzeigen (bis PS 2.0)

Get-Help about_aliases

es sind zahlreiche Aliase für CmdLets definiert, die Kompatibilität mit DOS und als Abkürzungen dienen

- Aliase anzeigen für einen Befehl, im Beispiel DIR

Get-Alias -name dir

 

Seitenanfang

Formatierung, Datenaufbereitung und Ausgabe/Export

Befehl Erklärung
Format-List | Kurz: fl Formatierte Liste
Format-Table | Kurz: ft Formatierte Tabelle
Sort-Object | Kurz: sort Sortierung aufsteigend
Sort-Object <Object> -Descending | Kurz: sort <Object> -Desc Sortierung absteigend
Out-File Ergebnis in eine Datei exportieren
Out-Printer Ergebnis an einen Drucker senden
   
   

Beispiele

Ausgabe formatieren als Liste mit Format-List oder Tabelle mit Format-Table, Hilfe zeigt help fl oder help ft (fl und ft sind Aliase)

- es wird der Name und Größe ausgegeben, die Spaltengröße ist auf Auto gesetzt (AutoSize)

dir | ft name, Length -AutoSize

- Ausgabe sortiert (Sort), nach Größe (Length), absteigend (-Descending, Kurz: desc)

dir | Sort Length -Descending | ft name,Length -AutoSize

 

Seitenanfang

Prozessverwaltung

Befehl Erklärung
Get-Process Prozesse
Get-Service Dienste
Get-Printer Liste installierter Drucker
Get-Printer | Get-PrintJob Liste aller Druckjobs
Get-Printer | Get-PrintJob | Remove-PrintJob Druckaufträge aller Drucker löschen
   

Beispiele

- Beispiel, alle Prozesse von calc beenden

Get-Process calc | Stop-Process

- Liste aller Prozesse sortiert nach WorkingSet (WS) absteigend (-Descending)

Get-Process | sort WorkingSet -Descending

- Liste aller gestoppten Systemdienste auf den angegebenen Drucker ausgeben

Get-Service | Where-Object Status -EQ stopped | Out-Printer -Name "FreePDF"
Seitenanfang

Powershell Variable

- Variable in einer PS-Sitzung definieren

$ip = '192.168.0.1'

- Variable aufrufen

echo $ip

 

 

 

Seitenanfang

Netzwerk

Befehl Erklärung
Get-NetworkConnectionInfo PS 2.0 - Netzwerkeinstellungen
Get-NetAdapterStatistics ab PS 3.0 - Netzwerkstatistik
New-SmbShare ab PS 3.0 - neue Freigabe erstellen
Grant-SmbShareAccess ab PS 3.0 - Rechte auf Freigaben setzen
Revoke-SmbShareAccess ab PS 3.0 - Rechte von Freigaben entfernen
Get-SmbShareAccess <Freigebe> ab PS 3.0 - gesetzte Rechte anzeigen
Get-SmbShare ab PS 3.0 - Liste aller Freigeben
Get-NetAdapter ab PS 3.0 - Netzwerkadapter
Get-NetAdapterBinding ab PS 3.0 - Netzadapter Bindung
Get-NetIPInterface ab PS 3.0 - NetzwerkInterface
New-NetIPAddress ab PS 3.0 - IP-Adresse des Interface statisch setzen und Gateway zuweisen
Get-NetIPAddress ab PS 3.0 - IP-Adresse des Interface
Set-NetIPAddress ab PS 3.0 - IP-Adresse des Interface auf DHCP setzen
Remove-NetIPAddress ab PS 3.0 - IP-Adresse des Interface entfernen
Get-NetRoute ab PS 3.0 - Routen anzeigen
Set-NetRoute ab PS 3.0 - Routen setzen
Remove-NetRoute ab PS 3.0 - Routen löschen
Get-DnsClientServerAddress ab PS 3.0 - DNS Einstellungen anzeigen
Set-DnsClientServerAddress ab PS 3.0 - DNS Einstellungen ändern
Clear-DnsClientCache ab PS 3.0 - DNS Cache löschen
Resolve-DnsName <domain.tld> ab PS 3.0 - DNS Hostabfrage, wie nslookup

Beispiele

- Netzwerkstatistik anzeigen

Get-NetAdapterStatistics -Name Ethernet | fl *

- Freigabe für den Ordner D:\Freigabe erstellen, Zugriff Jeder nur lesen. (PowerShell muss als Admin ausgeführt sein)

mkdir D:\Freigabe
New-SmbShare -Name Freigabe -Path D:\Freigabe `
 -Description "eine Freigabe" `
 -FullAccess Jeder `
 -FolderEnumerationMode AccessBased

- Rechte der Benutzer der Freigabe C$ anzeigen

Get-SmbShareAccess c$ | ft -AutoSize

- alle Netzwerkadapter Infos anzeigen

Get-NetAdapter | fl

- Netzwerkadapter Bindungen anzeigen

Get-NetAdapterBinding -name Ethernet | ft -autosize

- IPv6 Bindung des LAN Adapters "Ethernet" deaktivieren.

Get-NetAdapterBinding -Name Ethernet `
 -DisplayName *tcp/ipv6* | Disable-NetAdapterBinding

- Liste aller Einstellungen des Netzwerkinterfaces Ethernet

Get-NetIPInterface -InterfaceAlias "Ethernet" | fl

- IP-Adressen der angegebenen Schnittstelle anzeigen

Get-NetIPAddress -InterfaceAlias "Ethernet" | fl

- DNS Server für das angegebene Interface setzen, es können auch mehrere DNS Server angegeben werden

Set-DnsClientServerAddress -InterfaceAlias "Ethernet" -ServerAddresses 192.168.20.253
Set-DnsClientServerAddress -InterfaceAlias "Ethernet" `
 -ServerAddresses 192.168.20.252, 192.168.20.253, 192.168.20.254

- DNS Server für das angegebene Interface entfernen

Set-DnsClientServerAddress -InterfaceAlias "Ethernet" -ResetServerAddresses

 

Seitenanfang

Windows Server Verwaltung

- Powershell starten (mit Systemmodule importieren) Windows Server-Sicherung installieren

Add-WindowsFeature -name backup, backup-tools

- über Powershell prüfen ob Windows Server-Sicherung installiert ist

Get-WindowsFeature -name backup, backup-tools

- alle installierten Windows Feature anzeigen

Import-Module Servermanager
Get-WindowsFeature | where {$_.Installed -eq "True"} | ft DisplayName, Installed

- Liste aller verfügbaren Windows Feature, installierte und nicht installierte

Import-Module Servermanager
Get-WindowsFeature | ft DisplayName, Name, Installed

- alle Computer der Domain anzeigen

Get-ADComputer -Filter *

Hyper-V Verwaltung

- Version der VMs anzeigen

get-vm * | ft Name, Version

- Version der VM updaten von v5.0 (SRV 2012R2) auf v6.0 (SRV 10)

Update-VmConfigurationVersion <Name der VM>

- auf einem Core oder Nano Server die GUI Komponenten von CD nachinstallieren

Get-WindowsImage -ImagePath d:\sources\install.wim
Install-WindowsFeature -Name Server-Gui-Shell,Server-Gui-Mgmt-Infra -Source wim:d:\sources\install.wim:2

Server Grundeinrichtung per Powershell

- Variablen definieren, Powershell Remoteverbindung aufbauen, IP-Adressen konfigurieren und einer Domain beitreten.

$ip = <IP-Adresse des Servers>
$cred = Get-Credential <IP-Adresse des Servers>\Administrator

Set-Item WSMan:\localhost\Client\TrustedHosts $ip
Enter-PSSession -ComputerName $ip -Credential $cred

New-NetIPAddress -InterfaceIndex 3 -IPAddress 192.168.0.1 -PrefixLength 24 -DefaultGateway 192.168.0.254
Set-DnsClientServerAddress -InterfaceIndex 3 -ServerAddresses 192.168.0.254
Rename-Computer -NewName WinSRV2016 -Domainname domain.tld -Restart

 

Seitenanfang

Hyper-V Verwaltung

Befehl Erklärung
Get-VM Liste aller VMs
Get-VMProcessor -VMName <VM-Name> | fl Einstellungen der VM
   
   
   
   

ExposeVirtualizationExtensions= True

Nested Virtualisation einstellen (mind. 4GB RAM, kein Dynamic Memory)

Set-VMProcessor -VMName Test -ExposeVirtualizationExtensions $true

 

 

Seitenanfang

Domain Benutzer/Gruppen Management

Befehl Erklärung
New-AdUser neuen Benutzer anlegen
Get-AdUser Benutzer anzeigen
Set-ADuser Angaben zum Benutzer ändern
Remove-ADUser Benutzer löschen
   

 

- Benutzer in der Domain anlegen, alle neuen Benutzer bekommen das gleiche Passwort

###############################################################
# UserAdd.ps1
###################
# Variablen
###################
$Domain = "DC=domain,DC=zz"
$eDomain = "@domain.zz"
$Name = (Read-Host "BenutzerNamen bitte eingeben")
$VorName = (Read-Host "Vorname bitte eingeben")
$NachName = (Read-Host "Nachname bitte eingeben")
###################
New-AdUser -name "$Name" -UserPrincipalName "$Name$eDomain" -Enable $True `
 -AccountPassword (ConvertTo-SecureString 'Passwd' -AsPlainText -Force) `
 -Givenname "$VorName" `
 -Surname "$NachName" `
 -DisplayName "$Name"

- Benutzer der Domain anzeigen

Get-AdUser -Filter *

- Benutzerdaten des angegebenen Benutzers anzeigen, alle User mit Anfangsbuchstaben R anzeigen.

Get-AdUser -f {Name -eq '<Username>'}
Get-AdUser -f {Name -like 'R*'}

- bestimmte Angaben zum Benutzer anzeigen

Get-ADUser -f {Name -like '*'} -Properties * | fl `
 Name,UserPrincipalName,SamAccountName,Givenname,Surname,DisplayName

- Passwörter mehrerer User ändern (alle die mit U anfangen)

Get-ADUser -Filter {sAMAccountName -like "U*"} | Set-ADAccountPassword -Reset `
 -NewPassword (ConvertTo-SecureString -AsPlainText 'Passwort' -Force)

- alle Benutzer der Domain in Datei exportieren

###############################################################
# UserExport.ps1
###################
# Variablen
###################
$Domain = "DC=domain,DC=zz"
$eDomain = "@domain.zz"
$Abteilung = "OU=Benutzer,OU=_Firma"
$Folder = "C:\Temp"
$File = "user.txt"
###################
# prüfen ob Verzeichnis existiert, wenn nicht anlegen
if( -not (Test-Path $Folder) )
 { New-Item $Folder -Type directory -force | Out-Null }
# Benutzer Export in Datei: Name, Nachname, Vorname
Get-AdUser -Filter '*' -SearchBase "$Abteilung,$Domain" | Select-Object Name,Surname,Givenname `
 | Export-CSV "$Folder\$File" -NoTypeInformation

- Benutzerangaben vervollständigen

###############################################################
# UserUpdate.ps1
###################
# Variablen
###################
$eDomain = "@domain.zz"
$Folder = "C:\Temp"
$File = "user.txt"
###################
Import-Csv "$Folder\$File" | ForEach-Object {
# $_ ist das aktuelle Objekt, das in der Pipeline gerade verarbeitet wird
Set-ADuser -Identity $($_.Name) `
    -SamAccountName $($_.Name) `
    -UserPrincipalName $($_.Name + "$eDomain") `
    -Surname $($_.Surname) `
    -Givenname $($_.Givenname) `
    -DisplayName $($_.Name) `
}

 

- Gruppe anlegen (Groupscope: DomainLocal | Global | Universal), Mitglieder hinzufügen

New-ADGroup -Name <Gruppenname> -GroupScope DomainLocal
Add-ADGroupMember -Identity <Gruppenname> -Members User1,User2

- Mitglieder einer Gruppe anzeigen

Get-ADGroupMember -Identity Administratoren

 

Seitenanfang

Internet Explorer

c't Powershell Script

- Internet Explorer mit neuem Fenster starten

$ie=New-Object -ComObject InternetExplorer.Application

- IE Fenster sichtbar machen

$ie.Visible=$true

- Seite aufrufen

$ie.Navigate("https://login.1und1.de")

- wartet 4 sec bis die Seite aufgerufen wurde

while($ie.busy){Start-Sleep 4}

- das Feld Kunde ausfüllen, es trägt die ID "login.User", das gleiche mit dem Passwortfeld

$ie.Document.getElementById("login.User").value="domain.tld"
$ie.Document.getElementById("login.Pass").value="geheim"
Seitenanfang

Powershell Scripte

- Kommentare

# ein einzeiliges Kommentar
<# ein mehrzeiliger
Kommentar #>

 

Seitenanfang

Mailversand per Powershell

Powershell Benutzeranmeldung für die eMail Adresse hinterlegen in Datei MailPW.txt. (Benutzer:eMail | Passwort:Passwort für die eMail Adresse)

(Get-Credential).password | ConvertFrom-SecureString > MailPW.txt

$PSEmailServer - definiert den Standard Mailserver, da der Server eine Verschlüsselte Verbindung mit Authentifizierung möchte, muss -UseSSL und -Port 587 angegeben werden.

## Mailversand.ps1
## Variable
$pw = Get-Content .\MailPW.txt | ConvertTo-SecureString
$cred = New-Object System.Management.Automation.PSCredential "versand@domain.tld", $pw
$emailto = "empfang@domain.tld"
$emailfrom = "versand@domain.tld"
$day=(get-date).dayofweek
$date=(get-date -f yyyy-MM-dd)
$PSEmailServer = "smtp.strato.de"

## TLS1.2 Unterstuetzung aktivieren
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

Send-MailMessage -Credential $cred `
 -to $emailto `
 -from $emailfrom `
 -subject "[Windows] The backup has succeeded" `
 -body "The backup on $day" `
 -UseSSL -Port 587 -encoding ([System.Text.Encoding]::UTF8)

Fehler
Send-MailMessage : Fehler bei SSPI-Aufruf, siehe interne Ausnahme.

Lösung TLS1.2 aktivieren

- aktive Portokolle anzeigen
# Validate the configured protocol(s) is/are listed
[Net.ServicePointManager]::SecurityProtocol
# Enable TLS 1.2 as Security Protocol
[Net.ServicePointManager]::SecurityProtocol = `
    [Net.SecurityProtocolType]::Tls12 ;
# Enable TLS 1.2 and TLS 1.1 as Security Protocols
[Net.ServicePointManager]::SecurityProtocol = `
    [Net.SecurityProtocolType]::Tls12,
    [Net.SecurityProtocolType]::Tls11 ;

- per Aufgabenplanung anbinden, Einfache Aufgabe Aktion

Programm/Script:
Argumente hinzufügen:
Starten in:

%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe
-command "C:\Scripte\Backup\Mailversand.ps1"
C:\Scripte\Backup

Trigger: Bei einem Ereignis
Protokoll: Microsoft-Windows-Backup/Betriebsbereit
Quelle: Backup
Ereignis-ID: 7 Erfolgreich / 14 Fehlgeschlagen

Seitenanfang

sonstiges

- Liste von Laufwerken anzeigen

Get-PSDrive

- Liste von RegistrySchlüsseln zeigen

cd HKCU:\Software\Microsoft\Windows\CurrentVersion
dir

- zeigt Namen und Wert von Registryeinträgen (Get-ItemProperty)

gp .\Run

ändern von RegistryEinträgen sp (Set-ItemProperty)
löschen von RegistryEinträgen rp (Remove-ItemProperty)

Windows Paketverwaltung/Paketinstallation unter oneget.org (ab Powershell 5.0)

-Module oneget laden

import-module -name oneget

- Befehlsübersicht des Modules

get-command -module oneget

- Liste der verfügbare Pakete anzeigen

Find-Package | Out-Gridview