18
.NET User‘s Group Karlsruhe 26.04.2007

NET Users Group Karlsruhe 26.04.2007. Worum gehts? Goodby cmd.exe (ok ok, sie bleibt noch ein bisschen) Die Eingabeaufforderung erhält endlich einen

Embed Size (px)

Citation preview

Page 1: NET Users Group Karlsruhe 26.04.2007. Worum gehts? Goodby cmd.exe (ok ok, sie bleibt noch ein bisschen) Die Eingabeaufforderung erhält endlich einen

.NET User‘s Group Karlsruhe 26.04.2007

Page 2: NET Users Group Karlsruhe 26.04.2007. Worum gehts? Goodby cmd.exe (ok ok, sie bleibt noch ein bisschen) Die Eingabeaufforderung erhält endlich einen

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

Page 3: NET Users Group Karlsruhe 26.04.2007. Worum gehts? Goodby cmd.exe (ok ok, sie bleibt noch ein bisschen) Die Eingabeaufforderung erhält endlich einen

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

Page 4: NET Users Group Karlsruhe 26.04.2007. Worum gehts? Goodby cmd.exe (ok ok, sie bleibt noch ein bisschen) Die Eingabeaufforderung erhält endlich einen

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

Page 5: NET Users Group Karlsruhe 26.04.2007. Worum gehts? Goodby cmd.exe (ok ok, sie bleibt noch ein bisschen) Die Eingabeaufforderung erhält endlich einen

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

Page 6: NET Users Group Karlsruhe 26.04.2007. Worum gehts? Goodby cmd.exe (ok ok, sie bleibt noch ein bisschen) Die Eingabeaufforderung erhält endlich einen

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!

Page 7: NET Users Group Karlsruhe 26.04.2007. Worum gehts? Goodby cmd.exe (ok ok, sie bleibt noch ein bisschen) Die Eingabeaufforderung erhält endlich einen

Nu‘ zeig doch endlich…

Demo!

Page 8: NET Users Group Karlsruhe 26.04.2007. Worum gehts? Goodby cmd.exe (ok ok, sie bleibt noch ein bisschen) Die Eingabeaufforderung erhält endlich einen

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 ;-)

Page 9: NET Users Group Karlsruhe 26.04.2007. Worum gehts? Goodby cmd.exe (ok ok, sie bleibt noch ein bisschen) Die Eingabeaufforderung erhält endlich einen

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

Page 10: NET Users Group Karlsruhe 26.04.2007. Worum gehts? Goodby cmd.exe (ok ok, sie bleibt noch ein bisschen) Die Eingabeaufforderung erhält endlich einen

Mit cd, äh, Set-Location in die Registry? Ja!

Demo!

Page 11: NET Users Group Karlsruhe 26.04.2007. Worum gehts? Goodby cmd.exe (ok ok, sie bleibt noch ein bisschen) Die Eingabeaufforderung erhält endlich einen

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³

Page 12: NET Users Group Karlsruhe 26.04.2007. Worum gehts? Goodby cmd.exe (ok ok, sie bleibt noch ein bisschen) Die Eingabeaufforderung erhält endlich einen

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

Page 13: NET Users Group Karlsruhe 26.04.2007. Worum gehts? Goodby cmd.exe (ok ok, sie bleibt noch ein bisschen) Die Eingabeaufforderung erhält endlich einen

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!

Page 14: NET Users Group Karlsruhe 26.04.2007. Worum gehts? Goodby cmd.exe (ok ok, sie bleibt noch ein bisschen) Die Eingabeaufforderung erhält endlich einen

Was kann man damit machen?

Demo!

Page 15: NET Users Group Karlsruhe 26.04.2007. Worum gehts? Goodby cmd.exe (ok ok, sie bleibt noch ein bisschen) Die Eingabeaufforderung erhält endlich einen

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!

Page 16: NET Users Group Karlsruhe 26.04.2007. Worum gehts? Goodby cmd.exe (ok ok, sie bleibt noch ein bisschen) Die Eingabeaufforderung erhält endlich einen

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!)

Page 17: NET Users Group Karlsruhe 26.04.2007. Worum gehts? Goodby cmd.exe (ok ok, sie bleibt noch ein bisschen) Die Eingabeaufforderung erhält endlich einen

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

Page 18: NET Users Group Karlsruhe 26.04.2007. Worum gehts? Goodby cmd.exe (ok ok, sie bleibt noch ein bisschen) Die Eingabeaufforderung erhält endlich einen

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 ;-)