.NET User‘s Group Karlsruhe 26.04.2007
Worum geht‘s?
• Goodby cmd.exe (ok ok, sie bleibt noch ein bisschen)• Die Eingabeaufforderung erhält endlich
einen würdigen Nachfolger• Wenn schon, dann richtig: Es gibt nicht nur
Neues gegenüber cmd.exe, sondern viel Neuartiges
• PowerShell (ehemals „Monad“) ist strategisch für Microsoft• Neue Serveranwendungen werden
PowerShell-scriptfähig• Z. B. Exchange 2007, Virtual Server 2007
Wenn man eine Shell bauen darf Was muss eine Shell einfach drauf
haben, wenn sie sich Shell nennen will? Alles Bewährte Pipes, Ein-/Ausgabeumleitung Richtiges Scripting, Ablaufsteuerung
Und was hätten wir gerne? Neue Ideen, größere Mächtigkeit Einheitliche Befehlsstruktur Sicherheit
Der #1 Gag überhaupt
PowerShell ist vollständig .NET 2.0-basiert Wäre ja zu erwarten… aber:
Pipes reichen .NET-Objekte durch! Variablen halten .NET-Objekte! Einige Konsequenzen:
Formatierte Ausgabe! Liste, Tabelle, CSV, XML…
Filtern, Sortieren und sogar Gruppieren nach .NET-Eigenschaften
Was ist ein Befehl?
Befehle gibt’s nicht mehr, da sagt man jetzt CmdLet dafür ;-)
CmdLets sind .NET-Klassen, abgeleitet von einer Basisklasse
PowerShell nimmt CmdLets Arbeit ab Argumente parsen, prüfen und ggf.
Fehlermeldungen erzeugen CmdLets bekommen .NET-Objekte
und geben .NET-Objekte aus
Einheitliche Befehlsstruktur CmdLets werden immer durch die
Kombination Verb-Objekt aufgerufen Get-ChildItem, , Get-WmiObject, Format-
Table, Out-Printer, Group-Object, Export-Csv, …
Wenige Verben, viele Objekte Es gibt Aliase
Get-ChildItem = gci = dir = ls Vordefinierte und selbst definierte
Auch die Parametersyntax ist einheitlich Sie wird von der Shell geparst, nicht vom
CmdLet!
Nu‘ zeig doch endlich…
Demo!
Wie findet man was?
Wer suchet… … der findet
Welche Befehle gibt es? Get-Command
Welche Methoden und Eigenschaften hat dieses Objekt?
Get-Member, Get-Member -static
Hilfe zu einem Befehl Parameter -? oder Get-Help
Welche Aliase sind definiert? Get-Alias
Welche Funktionen sind definiert?
Get-ChildItem Function:
Welche Provider gibt es? Get-PSProvider
Hä? Provider? Was‘n das nu wieder?
Siehe nächste Folie ;-)
Gag #2: Provider!
Provider liefern PowerShell-Laufwerke Ja, A:, C: und D: nebst Kollegen sind alle
noch da Aber jetzt gibt es auch Laufwerke
namens…
Alias: Enthält alle Aliase
Cert: Enthält den Zertifikatsspeicher
Env: Enthält das Environment
Function: Enthält alle per PowerShell-Scriptsprache definierten Funktionen
HKCU: und HKLM:
Enthält die Registry
Variable: Enthält alle Variablen
Mit cd, äh, Set-Location in die Registry? Ja!
Demo!
Des Kaisers neue Kleider PowerShell kann man anpassen Schlüssel dazu sind Profile Profile sind Textdateien
Gibt‘s global auf der Maschine Kann‘s geben pro User Ganz extrem per XML-Konfigurationsdateien
Variable $profile enthält Pfad zum eigenen Profil
Erstmaliges Anlegen mit New-Item $profile –force
Editieren mit notepad $profile (yeah!) Standardmäßig nicht zugelassen – SD³
Ja wie, Scripte gehen nicht? Secure by Design, Deployment, Default
hat Folgen Ausführung aus lokalem Verzeichnis nur
via .\Befehl Wirkt eingeschleusten Virus-notepad.exe
entgegen Scripterweiterung .ps1 ist nicht mit
PowerShell verknüpft Nix da mit Doppelkick auf Script!
Scripts sind standardmäßig aus Erst durch Set-ExecutionPolicy aktivierbar Das darf ein normaler User gar nicht einstellen
Gag #3: Edel-Bauklötze Get-ChildItem, New-Item, Remove-Item
gehen auf jedem PowerShell-Laufwerk Where-Object, Sort-Object, Group-Object
filtern, sortieren, gruppieren nach egal was
ForEach-Object führt Befehl/Script auf jedem Objekt aus
$variable = @{} erzeugt eine Hashtable Select-Object gibt nur bestimmte
Eigenschaften, nur eindeutige oder die ersten/letzten n Objekte weiter
Add-Member fügt neue Eigenschaften hinzu!
Was kann man damit machen?
Demo!
Gag #4: Zugriff aufs .NET Framework (12345).ToString("x") $extension =
[IO.Path]::GetExtension($path) $r = New-Object System.Random;
$r.Next $Voice = New-Object -comObject
SAPI.SPVoice;$Voice.Speak("Hello, world!")
Und: Beliebige .NET DLLs laden!
Gag #5: Lad doch, was Du willst! [System.Reflection.Assembly]::LoadF
ile($MyAssemblyPath) Erlaubt Zugriff auf Objektmodelle,
die in Form einer .NET DLL vorliegen! Beispiele:
SQL Server 2005 DMO SF ft Community Publisher (Demo!)
Gag #6: Erweiterbarkeit Es gibt ein SDK zur PowerShell Man kann eigene CmdLets, Provider
usw. bauen Exchange 2007 und Virtual Server
2007 Management machen genau das
Mehrere Community-Projekte machen dasselbe
Kritik
Für eine Version 1.0 schick, aber da fehlt noch was… Komfort: Keine Script-IDE, kein zeitgemäßes
Debugging Community liefert mehrere Alternativen
Features Beispiel: Komfortabler ADSI-Zugriff war in Beta,
ist aber rausgefallen Auch hier hat die Community was zu bieten
Manchmal noch nicht zu Ende gedacht Beispiel: Get-Service liefert Startmodus nicht
Dann nehmen wir halt gleich Get-WmiObject Win32_Service
Version 2.0 wird bestimmt noch besser ;-)