# Powershell-Beispiele zum Vortrag "Powershell ohne Emotionen"
# Erstellt von Holger Voges
# Netz-Weise IT-Schulungen
# Freundallee 13a
# 30173 Hannover

# Teil 1:
# Kompatibilität mit der Kommandozeile
# ------------------------------------

# Die meisten Kommandozeilen-Befehle lassen sich auch direkt in der
# Powershell ausführen. Dafür sind meist Aliase (Verweise auf die
# entsprechenden Powershell-Befehle) oder Funktionen implementiert, 
# die die Kompatibilität herstellen

Dir C:\Windows
mkdir c:\Temp
man
ls

# einfache Commandlets einsetzen
# ------------------------------
# Viele Commandlets funktionieren durch Eingabe des Befehls ohne weitere 
# Optionen

# Anzeigen der laufenden Prozesse ( = tasklist.exe)
Get-Process

# alle verfügbaren Befehle anzeigen
get-command
# und die Powershell-Hilfe aufrufen
get-help 
# die Hilfe muß ab Powershell 3.0 erst einmal aktualisiert werden - dafür
# werden Admin-Rechte benötigt
Update-Help

# Alle installierten Dienste und Ihren Status anzeigen
Get-Service

# Installierte Updates anzeigen
Get-HotFix

# Alle Windows-Treiber einsetzen - hier werden schon 2 Parameter eingesetzt 
Get-WindowsDriver -Online -all

# Benötigt Hyper-V: Alle registrierten virtuellen Maschinen anzeigen
get-vm
# Die verfügbaren Netzwerk-Schnittstellen auflisten
Get-NetIPInterface
# Und alle IP-Adressen (ipV4 und ipV6)
Get-NetIPAddress

# Parameter einsetzen
# -------------------
# Parameter übergeben dem Commandlet weitere Optionen. Parameter werden immer mit 
# einem -<Parametername> <Argument> angegeben, wobei nicht alle Paramter ein Argument
# haben, wie man an den obigen Beispielen (-online, -all) schon gesehen hat.
# Es handelt sich dann um Schalter (ein/aus) bzw. Switch-Parameter

# Virtuelle Festplatten verwalten
# -------------------------------
# eine neue virtuelle Festplatte anlegen
new-vhd -Path D:\Hyper-V\Festplatte.vhdx -50GB -Dynamic
# eine Differenz-Datei zur neuen Festplatte anlegen
new-vhd -Path D:\Hyper-V\Festplatte_diff.vhdx -ParentPath D:\D:\Hyper-V\Festplatte.vhdx
# und schließlich die virtuelle Festplatte zur Verfügung stellen:
Mount-vhd -Path D:\Hyper-V\restplatte_diff.vhdx 

# Arbeiten mit dem Active Directory
# ---------------------------------
# Abrufen aller User im AD
Get-ADUser -filter *
# Den Ort aller Benutzer auf "Hannover" setzen - verwendet die Pipeline
# mehr zur Pipeline später
Get-ADUser -filter * | Set-ADUser -city 'Hannover'



# Mit Netzwerk-Schnittstellen und IP-Adressen arbeiten
# Alle Netzwerk-Schnittstellen ausgeben, die keine Verbindung haben
Get-NetIPInterface -ConnectionState Disconnected
# Alle Netzwerkschnittstellen ausgeben, die DHCP-aktiviert sind
Get-NetIPInterface -Dhcp Enabled
# Die Netzwerkschnittstelle ausgeben, der Name 'Lan-Verbindung' lautet
Get-NetIPInterface -InterfaceAlias 'Lan-Verbindung'
# Alle ipV4-Adresse ausgeben
Get-NetIPAddress -AddressFamily IPv4
# Die Fireall auf für alle Profile (Öffentlich,Privat,Domäne) deaktivieren
Set-NetFirewallProfile -All -Enabled False

# Arbeiten mti dem Eventlog
# Aus dem Application-Log alle Fehler auflisten
Get-EventLog -LogName Application -EntryType Error
# und die Fehler ausgeben - verwendet die Pipeline
Get-EventLog -LogName Application -EntryType Error | Out-GridView 

# Mit Umgebungsvariablen arbeiten
# Über $env:<Umgebungsvariablenname> greifen sie auf Umgebungsvariablen zu
$env:COMPUTERNAME

# Mit Pfaden arbeiten
# Mit Test-Path könnenSie überprüfen, ob ein Pfad existiert. Test-Path liefert
# true oder false zurück
test-path C:\windows\notepad.exe
# Mit -Pathtype Container oder -Pathtype Leaf können Sie festlegen, dass der
# angegebene Pfad ein Ordner oder eine Leaf-Objekt sein soll. Wir reden hier von
# Contain und Leaf, weil Test-Path auch z.B. mit der Registry funktioniert.
test-path 'C:\Program Files\7-Zip' -PathType Container 

# Split-Path kann Pfade auftrennen
split-path -Path C:\Windows\System32 -Parent
split-path -Path C:\Windows\System32 -Leaf 
# Und join-path erstellt einen Pfad
join-path -Path 'C:\Program Files' -ChildPath 'HolgerSoft'

# Auf Objekteigenschaften zurückgreifen
# -------------------------------------
# Wenn Sie auf die Eigenschaften der Objekte zurück greifen möchten, die Powershell
# Ihnen liefert, stellen Sie entweder den Befehl in Klammern und geben die Eigenschaft 
# an, die Sie aufrufen wollen, um nur diesen einen Wert zurück zu geben:
(Get-NetIPAddress -AddressFamily IPv4).IPAddress
# Oder Sie verwenden die Pipeline - siehe nächstes Beispiel


# Mit der Pipeline arbeiten
# -------------------------
# Die Pipeline funktioniert ähnlich wie die Pipeline in der Windows-Kommandozeile oder
# der Unix-Shell, ist aber ungleich leistungsfähiger, da Powershell mit Objekten und
# nicht mit Text arbeitet.
# Mit dem |-Zeichen wird die Ausgabe an das nächste Cmdlet zur Weiterverareitung weiter
# gegeben

# Alle virtuelle Maschinen stoppen
get-vm | stop-VM

# Alle Netzwerkprofile auf "private Netzwerk" umstellen
Get-NetConnectionProfile | Set-NetConnectionProfile -NetworkCategory Private

# ADUser bearbeiten - s. Beispiel oben
Get-ADUser -Filter * | Set-ADUser -City 'Hannover'

# Events in uns aus eine csv-Datei lesen
Get-Eventlog -LogName System -EntryType Error,Warning -ComputerName Client1,Client2 | Export-CSV -Path C:\Temp\Errorlist.csv -Delimiter ';'
Import-CSV -Path C:\temp\errorlist.csv | Out-GridView

# Alle installierten modern Apps deinstallieren
Get-AppxPackage | Remove-AppxPackage

# Webseiten abrufen mit Invoke-Webrequest
Invoke-WebRequest -Uri www.heise.de
(Invoke-WebRequest -Uri www.heise.de).Links
((Invoke-WebRequest -Uri www.heise.de).Links).href