1 / 37

Von WSH zu MSH Dr. Tobias Weltner

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)

chipo
Download Presentation

Von WSH zu MSH Dr. Tobias Weltner

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Student Technology Conference 2005 Von WSH zu MSH Dr. Tobias Weltner

  2. Von WSH zu MSH • Dr. Tobias Weltner • MVP Windows Server / Skriptautomation • www.scriptinternals.de • tobias.weltner@email.de

  3. 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

  4. 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

  5. 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

  6. 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

  7. 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"

  8. 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

  9. 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:

  10. Zwischenbilanz • Variablen • $a = ... • Objekt-Piping • dir | where... | grep-string... • reichhaltiger Befehlsschatz • einheitliche Namensräume • Dateisystem, Registry, Umgebungsvars...

  11. 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"

  12. 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")

  13. 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

  14. Vom WSH zur MSH $a = get-wmiobject win32_process $a = get-wmiobject win32_process -filter "name like '%iex%'" $a | out-grid

  15. 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

  16. Zwischenbilanz • COM-Objekte • werden von MSH voll unterstützt • .NET • Zugriff auf beliebige Datentypen • Zugriff auf .NET-Klassen

  17. 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

  18. 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

  19. Commandlets • CmdletDeclarationAttribute • Verb, Substantiv using System.Management.Automation; [CmdletDeclarationAttribute("Invoke", "Test")] class InvokeTest : Cmdlet { implementation }

  20. Commandlets • Klasse definiert 3 virtuelle Methoden class InvokeTest : Cmdlet { … public override void StartProcessing(); public override void ProcessRecord(); public override void EndProcessing(); … }

  21. 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 ); } } }

  22. 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

  23. 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

  24. 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}

  25. Mit Commandlets arbeiten $f = [System.IO.File].OpenText("c:\prozesse.txt") for (;;) { $line = $f.ReadLine() if ($line -eq $()) { break } write-host $line } $f.Close()

  26. 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

  27. 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

  28. 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

  29. 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

  30. Zwischenbilanz • Neue Commandlets als .NET-Klassen • COM-Komponenten • Ausführbare Programme (.EXE, .COM) • Skripts (.BAT, .VBS, .JS, .WS, etc.) • integrierte Funktionen • MSH-Skripts (.MSH)

  31. MSH-Skripts und Funktionen function addnums { $local:result = 0 foreach ( $local:a in $args ) { $result += $a } $result }

  32. 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(); }

  33. 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

  34. MSH - Fazit • Wann? • geplant für Longhorn • wird es auch für ältere Windows-Plattformen geben • Beta-Test läuft - am besten selbst mitmachen!

  35. MSH Testversion ausprobieren • Betaplace besuchen • www.betaplace.com • Beta-ID: mshPDC • benötigt .NET Framework 2.0 • %MSHCOMMANDPATH% erweitern

  36. Questions and Answers ? ? ? ? ?

  37. 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

More Related