microsoft academic program von wsh zu msh dr. tobias weltner student technology conference 2005
TRANSCRIPT
Microsoft Academic Program
Von WSH zu MSH Dr. Tobias Weltner
Student Technology Conference 2005
Microsoft Academic
Program
Student Technology Conference 2005
Von WSH zu MSH
• Dr. Tobias Weltner• MVP Windows Server / Skriptautomation• www.scriptinternals.de• [email protected]
Microsoft Academic
Program
Student Technology Conference 2005Automation
• 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
Microsoft Academic
Program
Student Technology Conference 2005Automation
• 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
Microsoft Academic
Program
Student Technology Conference 2005Windows 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 Academic
Program
Student Technology Conference 2005Microsoft 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
Microsoft Academic
Program
Student Technology Conference 2005Von 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"
Microsoft Academic
Program
Student Technology Conference 2005Von 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
Microsoft Academic
Program
Student Technology Conference 2005Von 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:
Microsoft Academic
Program
Student Technology Conference 2005Zwischenbilanz
• Variablen– $a = ...
• Objekt-Piping– dir | where... | grep-string...
• reichhaltiger Befehlsschatz• einheitliche Namensräume
– Dateisystem, Registry, Umgebungsvars...
Microsoft Academic
Program
Student Technology Conference 2005Vom 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"
Microsoft Academic
Program
Student Technology Conference 2005Vom 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")
Microsoft Academic
Program
Student Technology Conference 2005Vom 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
Microsoft Academic
Program
Student Technology Conference 2005Vom WSH zur MSH
$a = get-wmiobject win32_process
$a = get-wmiobject win32_process -filter "name like '%iex%'"
$a | out-grid
Microsoft Academic
Program
Student Technology Conference 2005Vom 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
Microsoft Academic
Program
Student Technology Conference 2005Zwischenbilanz
• COM-Objekte– werden von MSH voll unterstützt
• .NET– Zugriff auf beliebige Datentypen– Zugriff auf .NET-Klassen
Microsoft Academic
Program
Student Technology Conference 2005Commandlets - 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
Microsoft Academic
Program
Student Technology Conference 2005Commandlets
• 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
Microsoft Academic
Program
Student Technology Conference 2005Commandlets
• CmdletDeclarationAttribute– Verb, Substantiv
using System.Management.Automation;
[CmdletDeclarationAttribute("Invoke", "Test")]
class InvokeTest : Cmdlet
{
implementation
}
Microsoft Academic
Program
Student Technology Conference 2005Commandlets
• Klasse definiert 3 virtuelle Methoden
class InvokeTest : Cmdlet
{
…
public override void StartProcessing();
public override void ProcessRecord();
public override void EndProcessing();
…
}
Microsoft Academic
Program
Student Technology Conference 2005Commandlets
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 );
}
}
}
Microsoft Academic
Program
Student Technology Conference 2005Commandlets
• 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
Microsoft Academic
Program
Student Technology Conference 2005Mit 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
Microsoft Academic
Program
Student Technology Conference 2005Mit 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}
Microsoft Academic
Program
Student Technology Conference 2005Mit Commandlets arbeiten
$f = [System.IO.File].OpenText("c:\prozesse.txt")
for (;;)
{ $line = $f.ReadLine()
if ($line -eq $())
{ break
}
write-host $line
}
$f.Close()
Microsoft Academic
Program
Student Technology Conference 2005Mit 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
Microsoft Academic
Program
Student Technology Conference 2005Mit 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
Microsoft Academic
Program
Student Technology Conference 2005Mit 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
Microsoft Academic
Program
Student Technology Conference 2005Mit 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
Microsoft Academic
Program
Student Technology Conference 2005Zwischenbilanz
• Neue Commandlets als .NET-Klassen• COM-Komponenten• Ausführbare Programme
(.EXE, .COM) • Skripts (.BAT, .VBS, .JS, .WS, etc.)
• integrierte Funktionen• MSH-Skripts (.MSH)
Microsoft Academic
Program
Student Technology Conference 2005MSH-Skripts und Funktionen
function addnums
{
$local:result = 0
foreach ( $local:a in $args )
{
$result += $a
}
$result
}
Microsoft Academic
Program
Student Technology Conference 2005MSH-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();
}
Microsoft Academic
Program
Student Technology Conference 2005MSH - 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
Microsoft Academic
Program
Student Technology Conference 2005MSH - Fazit
• Wann?– geplant für Longhorn– wird es auch für ältere Windows-
Plattformen geben– Beta-Test läuft - am besten selbst
mitmachen!
Microsoft Academic
Program
Student Technology Conference 2005MSH Testversion ausprobieren
• Betaplace besuchen– www.betaplace.com
• Beta-ID: mshPDCmshPDC
• benötigt .NET Framework 2.0• %MSHCOMMANDPATH% erweitern
Microsoft Academic
Program
Student Technology Conference 2005
Questions and Answers ??
??
?
Microsoft Academic
Program
Student Technology Conference 2005
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