PowerShell for Runaways - Part I
16.12.2007
23:17:35 Uhr47613 Aufrufe
11 Antworten
23:17:35 Uhr
11 Antworten
Hilfreich +7
Hallo ans Forum
Die PowerShell hat sich inzwischen zu meinem Lieblings-Werkzeug unter Windows entwickelt, aber leider wird sie IMHO noch zu wenig genutzt.
Von den Mitschülern in der Berufschule und auch den Admins an meinem Arbeitsplatz nutzen nur wenige die PowerShell, die meisten hängen noch beim Windows Scripting Host oder Batch fest.
Dabei ist die PowerShell überaus mächtig. Einerseits kann man mit der Powershell auf das gesamte .NET Framework 2.0 zugreifen (was mit WSH nicht möglich ist), andererseits kann man ausserdem wie bei WSH auf alle WMI- und COM-Objekte zugreifen.
Dieses Tutorial dient also vor allem dazu, die Angst vor einem Umstieg zu nehmen und einen kurzen Überblick zu bieten, so dass man anfangen kann, Scripts zu schreiben.
Folgende Möglichkeiten gibt es, PowerShell-Scripts zu starten:
Mit dem folgenden CMDLet-Befehl wird die Execution-Policy auf "Unrestricted" gesetzt
Wenn das Textfile um die Ausgabe erweitert werden soll:
Folgendermassen können die Kommandozeilenargumente verwendet werden:
und folgendermassen ausgegeben:
und folgendermassen ausgegeben:
Folgendermassen können einzelne Felder des Arrays ausgegeben werden:
Die Nummerierung der Felder eines Arrays fängt bei 0 an.
Folgendermassen werden Konstanten ausgegeben, rsp. abgefragt:
Methoden des Objekts benutzen:
Ich hoffe, ich konnte einen kurzen Einblick geben und wünsche viel Spass beim Script-Umschreiben!
PS: Herzlichen Dank an Frank Koch von Microsoft Schweiz, von dessen PowerShell-Manual ich einige Sachen entlehnt habe.
Nachtrag:
Hier gibts die PowerShell zum Download:
http://www.microsoft.com/windowsserver200 ...
Die PowerShell hat sich inzwischen zu meinem Lieblings-Werkzeug unter Windows entwickelt, aber leider wird sie IMHO noch zu wenig genutzt.
Von den Mitschülern in der Berufschule und auch den Admins an meinem Arbeitsplatz nutzen nur wenige die PowerShell, die meisten hängen noch beim Windows Scripting Host oder Batch fest.
Dabei ist die PowerShell überaus mächtig. Einerseits kann man mit der Powershell auf das gesamte .NET Framework 2.0 zugreifen (was mit WSH nicht möglich ist), andererseits kann man ausserdem wie bei WSH auf alle WMI- und COM-Objekte zugreifen.
Dieses Tutorial dient also vor allem dazu, die Angst vor einem Umstieg zu nehmen und einen kurzen Überblick zu bieten, so dass man anfangen kann, Scripts zu schreiben.
Sicherheitsmassnahmen der PowerShell
Die PowerShell hat diverse Script-Sicherheitsmassnahmen integriert. Im Gegensatz zu Scripts in den diversen anderen Scriptsprachen (VBScript, Perl, JScript, Batch) kann man PowerShell-Scripts nicht per Doppelklick auf die Datei starten. Dies hat den Vorteil, dass Schad-Scripts, welche im Anhang von Mails verschickt werden, nicht einfach so gestartet werden können.Folgende Möglichkeiten gibt es, PowerShell-Scripts zu starten:
- Beim Start über die Shell direkt muss ein .\ vorne dran gehängt werden. .\scriptname
- Starten eines Scripts mittels einer Verknüpfung oder per Batch-Datei: powershell.exe -command "C:\Scriptname.ps1"
- Restricted --> Keine Skripte werden ausgeführt
- Allsigned --> Nur signierte Skripte werden ausgeführt
- RemoteSigned --> Lokal erstellte Skripte sind erlaubt, aber andere Skripte müssen signiert sein
- Unrestricted --> Alle Scripts werden ausgeführt
Mit dem folgenden CMDLet-Befehl wird die Execution-Policy auf "Unrestricted" gesetzt
01.
set-executionpolicy unrestrictedOnline-Hilfe der CMDLets abrufen
Die Online-Hilfe der einzelnen CMLets (so heissen die Befehle bei der Powershell) lässt sich folgendermassen abrufen:01.
get-help CMDLet -fullScripting
Nun kommen wir zum eigentlichen Scripting. PowerShell-Scripts sind normale Textdateien mit der Endung .ps1, welche mit jedem beliebigen Texteditor bearbeiten werden können.Ein-/Ausgabe
Ausgabe an die Konsole
01.
write-host "Ausgabe"Ausgabe in ein ANSI-Textfile
01.
"Ausgabe" | out-file -filepath C:\logfile.txt -encoding Default01.
"Ausgabe" | out-file -filepath C:\logfile.txt -encoding Default -appendAusgabe in ein CSV-File
01.
$a = get-process 02.
$a | select-object Name,Path,Company | Export-csv -path C:\text.csvAusgabe in ein HTML-File
01.
$a = get-process 02.
$a | convertto-html -property Name,Path,Company > C:\test.htmlBenutzereingaben verwenden
01.
$Eingabe = Read-Host "Bitte geben Sie etwas ein:" 02.
Write-Host "Sie haben folgendes eingegeben: " $EingabeKommandozeilenargumente verwenden
Die Kommandozeilenargumente müssen per Leerschlag übergeben werden:01.
.\scriptname Argument1 Argument201.
$Argument1 = $args[0] 02.
$Argument2 = $args[1]Aus einer Textdatei lesen
Hier wird mittels einer ForEach-Schleife für jede Zeile des Textfiles ein Befehlssatz ausgeführt:01.
$Zeile = get-content "C:\textfile.txt" 02.
foreach-object ($i in $Zeile) { 03.
# Befehle 04.
}Variabeln, Arrays und Konstanten
Variabeln
Variabeln werden folgendermassen definiert...01.
$Variabelnname = Inhalt01.
$VariabelnnameArrays
Arrays werden folgendermassen definiert...01.
$Arrayname = 1,5,9,1001.
$Arrayname01.
$Arrayname[3]Konstanten
Konstanten werden ohne $ kreiert:01.
set-variable -name Konstantenname -value Inhalt -option constant01.
$KonstantennameSchleifen und Bedingungen
If Bedingung
Führt einen Befehlssatz aus, wenn eine Bedingung erfüllt ist:01.
$Variable = "Rot" 02.
if ($Variable -eq "Rot") 03.
{"Die Farbe ist rot!"} 04.
elseif ($Variable -eq "Blau") 05.
{"Die Farbe ist blau!"} 06.
else 07.
{"Eine andere Farbe..."}Switch Bedingung
Eine komfortablere Möglichkeit, Befehlssätze bei Erfüllung einer Bedingung zu auszuführen:01.
$Variable = "Rot" 02.
switch ($Variable) { 03.
"Rot" {"Die Farbe ist rot!"} 04.
"Blau" {"Die Farbe ist blau!"} 05.
default {"Eine andere Farbe..."} 06.
}Do While Schleife
Führt die Schleife aus, SOLANGE die Bedingung erfüllt ist:01.
$Variable = 1 02.
Do {$Variable;$Variable++} 03.
While ($Variable -lt 10) Do Until Schleife
Führt die Schleife aus, BIS die Bedingung erfüllt ist:01.
$Variable = 1 02.
Do {$Variable;$Variable++} 03.
Until ($Variable -gt 10)For Schleife
Befehle in definierter Anzahl ausführen:01.
For ($Variable=1; $Variable -le 10; $Variable++) 02.
{$Variable} ForEach Schleife
Arbeitet eine Gruppe von Objekte an01.
Foreach-object ($i in get-childitem C:\windows) 02.
{$i.name; $i.creationtime}Objekte verwenden
COM-Objekte
Ein Objekt kreieren:01.
$objNetzwerk = new-object -comobject "wscript.network"01.
objNetzwerk.usernameWMI-Objekte
WMI-Objekte abfragen:01.
get-wmiobject -class win32_operatingsystem -computername AbzufragenderComputer.NET Framework Objekte
.NET Objekt kreieren (Parameter können übergeben werden, falls nötig):01.
$dotnetobjDateTime = New-Object -Type System.DateTime 2007,12,26 02.
$dotnetobjDateTime.get_DayOfWeek()Sonstiges
Kommentare
Kommentare werden mit einem # eingeführt:01.
# Diese Codezeile wird nicht ausgeführtIch hoffe, ich konnte einen kurzen Einblick geben und wünsche viel Spass beim Script-Umschreiben!
PS: Herzlichen Dank an Frank Koch von Microsoft Schweiz, von dessen PowerShell-Manual ich einige Sachen entlehnt habe.
Nachtrag:
Voraussetzungen für die Verwendung der PowerShell
Grundsätzlich wird die PowerShell von den Betriebsystemen XP, Vista, Server 2003, Exchange 2007 und Server 2008 unterstützt. Je Betriebsystem gibt es eine eigene Version der PowerShell. Ausserdem muss die Sprache beachtet werden. Was zusätzlich noch vonnöten ist, ist die Installation des .NET Framework 2.0, welches über die Windows Updates eingespielt werden kann.Hier gibts die PowerShell zum Download:
http://www.microsoft.com/windowsserver200 ...
kallewirsch schreibt am 20.12.2007 um 20:21:27 Uhr
> Vielleicht noch mal irgendwann einen
neuen Nick besorgen..*gg
Vorschläge?
neuen Nick besorgen..*gg
Vorschläge?
Hallo TuxHunt3R,
ich bin von Deinem Tutorial begeistert. Vielleicht kann ich Dir mit vier Buchtiteln weiterhelfen, werde die Titel aber erst morgen posten können.
Allerdings beteilige ich mich nicht an den Vorschlägen für Deinen neuen Nick......
Weiterso.
Grüße
Kallewirsch
TuXHunt3R schreibt am 31.05.2008 um 19:15:17 Uhr
Gegenüber was? VBScript oder der CMD-Shell?
OK, hier sind sie:
Diese Codezeile speichert den Inhalt des Textfiles C:\test.txt in einem Array mit dem Namen "$Textfile". Du musst also nicht eine ganze Funktion für das Einlesen eines Textfiles in ein Array schreiben, eine Codezeile verwenden. Jede Zeile eines Textfiles ist nun als Objekt in diesem Array gespeichert. Dieses Array kannst du nun z.B. in einer Foreach-Schleife weiterverwenden.
Diese Schleife gibt z.B. das Textfile zeilenweise, d.h. objektweise aus und schreibt vor jede Zeile den Text "Blabla". Es gibt natürlich noch andere Möglichkeiten....
Ausserdem ist die PowerShell Script Language stark an C# angelehnt, was den Umstieg auf diese sehr weit verbreitete Programmiersprache erleichert.
Wenn du ein umfassendes Beispielscript sehen willst, schau mal hier:
http://www.administrator.de/index.php?con ...
OK, hier sind sie:
- Logische Befehlssyntax. Jeder Befehl, d.h. jedes CMDlet ist nach dem Prinzip VERB-SUBSTANTIV aufgebaut
- Stark ausgebautes Piping. Jeder Befehl kann über die Pipe ( | ) an andere Befehle übergeben werden (sofern sinnvoll, natürlich)
- Volle Unterstützung des .NET Frameworks, es ist aber trotzdem noch möglich mit den (veralteten) COM-Objekten zu arbeiten
- Weniger Code, der auch einfacher zu lesen ist als VBScript.
- Einfachere Verwendung von CSVs, XML und HTML. Genannt seien hier z.B. die CMDlets "Import-CSV", "Export-CSV" und "Convertto-HTML".
- Jeder Output ist als Objekte im RAM gespeichert, nicht wie der CMD-Shell als Text. Dazu hier ein Beispiel:
01.
$Textfile = get-content C:\test.txt01.
foreach ($Linie in $Textfile) {write-host "Blabla"$Linie}Ausserdem ist die PowerShell Script Language stark an C# angelehnt, was den Umstieg auf diese sehr weit verbreitete Programmiersprache erleichert.
Wenn du ein umfassendes Beispielscript sehen willst, schau mal hier:
http://www.administrator.de/index.php?con ...
Screwler schreibt am 09.09.2011 um 10:56:15 Uhr
Zitat von TuXHunt3R:
Bevor überhaupt Scripts ausgeführt werden können, muss ausserdem die Execution-Policy definiert werden. Das geht
mit dem CMDLet "set-executionpolicy". Es gibt 4 verschiedene Stufen:
Mit dem folgenden CMDLet-Befehl wird die Execution-Policy auf "Unrestricted" gesetzt
Bevor überhaupt Scripts ausgeführt werden können, muss ausserdem die Execution-Policy definiert werden. Das geht
mit dem CMDLet "set-executionpolicy". Es gibt 4 verschiedene Stufen:
- Restricted --> Keine Skripte werden ausgeführt
- Allsigned --> Nur signierte Skripte werden ausgeführt
- RemoteSigned --> Lokal erstellte Skripte sind erlaubt, aber andere Skripte müssen signiert sein
- Unrestricted --> Alle Scripts werden ausgeführt
Mit dem folgenden CMDLet-Befehl wird die Execution-Policy auf "Unrestricted" gesetzt
Bis hier hin noch wunderbar die einzelnen Stufen der executionpolicy aufgelistet
01.
set-executionpolicy unrestrictedUnrestricted ist sicherlich für eine Testumgebung eine gut gewählte Lösung. Aber sicherheitstechnisch wäre
01.
set-executionpolicy remotesignedAuf Servern wäre sogar allsigned besser, wenn man die Möglichkeit hat Signaturen zu erstellen.
Also wäre es sicher besser, den Leitfaden dahingehend anzupassen.
Im Übrigen ist in der Fachliteratur auch immer nur der Modus RemoteSigned gesetzt. (Siehe dazu: Windows PowerShell von Holger Schwichtenberg - Seite 107 (erschienen 2008, Addison-Wesley-Verlag)













