370 likes | 542 Views
Student Technology Conference 2005. Von WSH zu MSH Dr. Tobias Weltner. Von WSH zu MSH. Dr. Tobias Weltner MVP Windows Server / Skriptautomation www.scriptinternals.de tobias.weltner@email.de. Automation. Heute vorhandene Automationslösungen Shell Skripts (Batch)
E N D
Student Technology Conference 2005 Von WSH zu MSH Dr. Tobias Weltner
Von WSH zu MSH • Dr. Tobias Weltner • MVP Windows Server / Skriptautomation • www.scriptinternals.de • tobias.weltner@email.de
Automation • Heute vorhandene Automationslösungen • Shell Skripts (Batch) • Windows Script Host (WSH) • Sind wir damit glücklich? • Shell Skripts zu limitiert • WSH-Skripts zu kompliziert • .NET-Integration fehlt beiden
Automation • Shell Skripts • basieren auf vorhandenen Programmen • lassen sich leicht erweitern • einfach (kurze Befehle, schnelle (Miß)Erfolge) • Text-Piping • uneinheitliche Befehle/Syntax • keine Unterstützung für COM oder .NET
Windows Script Host • Strukturierte Sprache (VBScript, JScript) • Zugriff auf COM-Komponenten • Ansätze von Objektorientiertheit • Programmiererfahrung nötig • Kein Rahmenwerk (Includes) • Keine .NET-Unterstützung
Microsoft Shell (MSH) • Erweiterbare Skriptumgebung • Einfache Befehle wie bei Shell Skripts • erweiterbar durch .NET-Klassen • COM-Unterstützung wie bei WSH • Strukurierte Sprache • KSH, BASH, PERL, RUBY, VMS DCL, AS400 CL • Objekt-Piping
Von Shell Skripts zu MSH NETSTAT –E PING 10.10.10.10 DIR C: $resultat = NETSTAT –E foreach ( $line in $resultat ) { if ( $line -ilike "*unicast*" ) { $line } } $ip = "10.10.10.10" ping -n 1 -w 100 $ip | where {grep-string -text $_ -pattern "antwort"} | echo "Online"
Von Shell Skripts zu MSH Dir *.vbs Dir *.vbs | foreach {type $_} Dir *.vbs | grep-string -pattern "isNumeric" Dir *.vbs | where {grep-string $_ -pattern "isNumeric"} Dir *.vbs | where {grep-string $_ -pattern "isNumeric"} | foreach {type $_ } Cd HKCU:\Software Dir Md MSHTest Del MSHTest
Von Shell Skripts zu MSH Dir HKLM:\SOFTWARE\*\Cryptography Dir HKCU:\ Dir -recurse Dir HKCU:\ -recurse | where {$_.childname -ilike "*SYS*"} Dir $env:path.split(";") *.exe |group name |where {$_.count -gt 1} Dir Env: Dir Variable: Dir Function:
Zwischenbilanz • Variablen • $a = ... • Objekt-Piping • dir | where... | grep-string... • reichhaltiger Befehlsschatz • einheitliche Namensräume • Dateisystem, Registry, Umgebungsvars...
Vom WSH zur MSH • Größte Stärke des WSH: COM-Integration • VBScript kann fremde DLLs verwenden Set objnet = CreateObject("WScript.Network") objnet.MapNetworkDrive "G:", "\\127.0.0.1\c$" Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = true objIE.Navigate "www.scriptinternals.de"
Vom WSH zur MSH $objnet = new-object -activex "WScript.Network" $objnet.MapNetworkdrive("X:", "\\127.0.0.1\c$") explorer x: $objnet.RemoveNetworkDrive("X:") $objie = new-object -activex "InternetExplorer.Application" $objie.visible = 1 $objie.navigate("www.scriptinternals.de")
Vom WSH zur MSH • WMI-Integration Set objWMI = GetObject("winmgmts:") Set objAll = objWMI.InstancesOf("Win32_Process") For Each objProcess In objAll WScript.Echo objProcess.GetObjectText_ Next
Vom WSH zur MSH $a = get-wmiobject win32_process $a = get-wmiobject win32_process -filter "name like '%iex%'" $a | out-grid
Vom WSH zum MSH $d= new-object System.DateTime 2004 12 1 $d= new-object System.Web.Services.Discovery.DiscoveryDocument -file C:\WINDOWS\Microsoft.NET\Framework\v2.0.40209\System.Web.Services.dll
Zwischenbilanz • COM-Objekte • werden von MSH voll unterstützt • .NET • Zugriff auf beliebige Datentypen • Zugriff auf .NET-Klassen
Commandlets - die MSH-Befehle • bestehen aus einem Verb-Substantiv • grep-string, new-item, get-help • Alias-Namen erleichtern den Umgang • Dir, Cd, Md, Help • Dir Alias:\Cd • set-alias Hilfmir get-help • set-alias edit notepad.exe
Commandlets • Commandlets sind .NET-Klassen • DLLs, keine EXE • Provider bieten einheitliche Frameworks • Dateisystem, Registry, Active Directory... • Pipelines bestehen aus Commandlets, die strukturierte Objekte austauschen • Extended Type System (ETS) kümmert sich um die Interfaces für Piping
Commandlets • CmdletDeclarationAttribute • Verb, Substantiv using System.Management.Automation; [CmdletDeclarationAttribute("Invoke", "Test")] class InvokeTest : Cmdlet { implementation }
Commandlets • Klasse definiert 3 virtuelle Methoden class InvokeTest : Cmdlet { … public override void StartProcessing(); public override void ProcessRecord(); public override void EndProcessing(); … }
Commandlets public class InvokeTest : Cmdlet { private string message; [ParsingPromptString("Enter a string to echo: " )] [ParsingParameterMapping(0)] [ParsingMandatoryParameter] public string Message { get { return message; } set { message = value; } } public override void ProcessRecord() { WriteObject( message ); } } }
Commandlets • Verb-Noun.cmdlet und zugehörige DLL • in Ordner speichern, der in %MSHCOMMANDPATH% liegt • MSH erkennt Commandlets beim Start Microsoft.Samples.Management.Automation.InvokeHelloWorld HelloWorld.dll HelloWorld, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null HelloWorld.dll-Help.xml
Mit Commandlets arbeiten get-command get-command *out* get-command -noun clipboard get-command -verb out get-help out-grid get-help foreach $a = get-item c:\test.txt $a | format-list $a | out-grid $a | format-list * $a | out-html
Mit Commandlets arbeiten $a | get-member $a | get-member -m $a.getHashCode $a.getHashCode() $a.set_CreationTime("10.4.2003") $a.copyto("c:\test.bak") new-item c:\prozesse.txt -type file set-content c:\prozesse.txt -value $(get-process) $i=0; foreach ($line in $(get-content c:\prozesse.txt)) {"{0}: {1}"-f $i, $Line; $i+=1}
Mit Commandlets arbeiten $f = [System.IO.File].OpenText("c:\prozesse.txt") for (;;) { $line = $f.ReadLine() if ($line -eq $()) { break } write-host $line } $f.Close()
Mit Commandlets arbeiten get-process | export-xml c:\prozesse.xml $prozesse = import-xml c:\prozesse.xml grep-string "default" "c:\boot.ini" get-uri http://www.microsoft.com/ | split-string | split-string -pattern ">" | grep-string -pattern "href" | sort line.length | table line
Mit Commandlets arbeiten $getid = { foreach ( $p in $input ) { $p.Id } } get-process | &$getid get-command get-process | format-list * get-process |pick-object ProcessName -expand Modules | out-grid get-process |format-table @{Expression= {$_.ProcessName.ToUpper()}; Label= "Name"; Width= 15 },@{Label = "KB" ;Expression = {($_.WorkingSet + 1023)/1024}; Format = "{0,15} KB" } –auto
Mit Commandlets arbeiten $prozesse = get-process $prozesse | where {$_.hasExited -eq 1} | out-grid get-process | where { $_.processname -ieq "iexplore" } | foreach { $_.Kill() } get-process | where { $_.processname -ilike "*iexplore*" } | sort-object -p cpu | pick-tail 1 | foreach { $_.Kill() } ps | out-chart processname,workingset
Mit Commandlets arbeiten get-service Alerter | get-member -m $service = get-service Alerter $service.Stop get-eventlog -logname system | group-object username get-eventlog -logname system | pick-tail 10 get-eventlog -logname system | pick-head 10 | pick-object -p source get-command -verb get
Zwischenbilanz • Neue Commandlets als .NET-Klassen • COM-Komponenten • Ausführbare Programme (.EXE, .COM) • Skripts (.BAT, .VBS, .JS, .WS, etc.) • integrierte Funktionen • MSH-Skripts (.MSH)
MSH-Skripts und Funktionen function addnums { $local:result = 0 foreach ( $local:a in $args ) { $result += $a } $result }
MSH-Skripts und Funktionen $phrase = $args[0]; $wd = new-object -activex "word.application"; $p = pwd; if ($args.length > 1) { $docs = $args[1]; } else { $docs = "*.doc"; } foreach ($a in $(get-childitem $docs -name)) { $doc = $wd.documents.open("$p\$a"); if ($doc.content.find.execute("$phrase")) { write-host "Wort" $phrase "gefunden in" $a $file = get-item $p\$a Write-host $file.length "Bytes. Zuletzt geändert am" $file.LastWriteTime } $doc.close(); }
MSH - Fazit • Einfacher Umstieg von Shell/WSH • COM-Objektmodelle und externe Tools bleiben erhalten • Sehr dichte und machtvolle Sprache • anpassbar durch Aliase • erweiterbar durch .NET-Klassen • Schnelle Resultate • Objekt-Piping
MSH - Fazit • Wann? • geplant für Longhorn • wird es auch für ältere Windows-Plattformen geben • Beta-Test läuft - am besten selbst mitmachen!
MSH Testversion ausprobieren • Betaplace besuchen • www.betaplace.com • Beta-ID: mshPDC • benötigt .NET Framework 2.0 • %MSHCOMMANDPATH% erweitern
Questions and Answers ? ? ? ? ?
Mehr Informationen • http://www.betaplace.com • http://msdn.microsoft.com/library/en-us/wmisdk/wmi/wmi_classes.asp • http://download.microsoft.com/download/3/8/1/38198a72-294d-46c3-93ba-faee5cf85d00/ARC334.ppt • http://channel9.msdn.com/ShowPost.aspx?PostID=25531#25531