Managing Systems with PowerShell Jeffrey P. Snover Partner Architect What is PowerShell? V2 Community Technology Preview (CTP) Learning PowerShell Automating with PowerShell Windows PowerShell New command-line shell and scripting language As interactive and composable as BASH/KSH As programmatic as Perl/Python/Ruby As production oriented as AS400 CL/VMS DCL Allows access to data stores as easy to access as filesystem The Difference is OBJECTS! Get-Process | Where { $_.handles –gt 500 } | Sort handles | Format-Table Common Windows PowerShell Parser Format Cmdlet Sort Cmdlet Where Cmdlet Get-Process Cmdlet Windows PowerShell Pipeline Processor Demo: Short Introduction to PowerShell Jeffrey P Snover Partner Architect State of the Software Phenomenal rate of adoption > 1.55 Million downloads in < 1 year Exchange 2007, MOM 2007 Virtual Machine Manager 2007 Lotus Domino Transporter Suite Data Protection Manager Compute Cluster Tool Pack Windows Server Backup Good ISV pickup > 20 new internal partners CEC 2009 requirement Won both Best of TechEd and Teched Attendees Pick State of the Software - Community Active and useful Newsgroups and Forums 25 Codeplex projects (2 in the top 25 most active) Strong group of MVPs Strong community tools Tower of Power Mailbox Statistics Exchange 2003 (VBScript) E12 (Monad Script) Set listExchange_Mailboxs = GetObject("winmgmts:{impersonationLevel=impersonate}!\\COMPUTERNAME\ROOT\MicrosoftExchangeV2"). InstancesOf("Exchange_Mailbox") get-mailboxstatistics –server $servername For Each objExchange_Mailbox in listExchange_Mailboxs WScript.echo "AssocContentCount =” + objExchange_Mailbox.AssocContentCount WScript.echo " DateDiscoveredAbsentInDS =” + objExchange_Mailbox.DateDiscoveredAbsentInDS WScript.echo " DeletedMessageSizeExtended =” + objExchange_Mailbox. DeletedMessageSizeExtended WScript.echo " LastLoggedOnUserAccount =” + objExchange_Mailbox. LastLoggedOnUserAccount WScript.echo " LastLogoffTime =” + objExchange_Mailbox. LastLogoffTime WScript.echo " LastLogonTime =” + objExchange_Mailbox. LastLogonTime WScript.echo " LegacyDN =” + objExchange_Mailbox. LegacyDN WScript.echo " MailboxDisplayName =” + objExchange_Mailbox. MailboxDisplayName WScript.echo " MailboxGUID =” + objExchange_Mailbox. MailboxGUID WScript.echo " ServerName =” + objExchange_Mailbox. ServerName WScript.echo " Size =” + objExchange_Mailbox. Size WScript.echo " StorageGroupName =” + objExchange_Mailbox. StorageGroupName WScript.echo " StorageLimitInfo =” + objExchange_Mailbox. StorageLimitInfo WScript.echo " StoreName =” + objExchange_Mailbox. StoreName WScript.echo " TotalItems =” + objExchange_Mailbox. TotalItems Next Database Mgmt Dim StorGroup as New CDOEXM.StorageGroup StorGroup.DataSource.Open "LDAP://" + DCServer + "/ CN=First Storage Group,CN=InformationStore,CN=" + Server + ",CN=Servers,CN=First Administrative Group, CN=Administrative Groups,CN=First Organization, CN=Microsoft Exchange,CN=Services, CN=Configuration," + DomainName StorGroup.MoveLogFiles("C:\newlogPath", 0) Recipient Mgmt Dim objMailbox As CDOEXM.IMailboxStore Set objMailbox = GetObject("LDAP://" + DCServer + "CN=FOO,CN=users," + DomainName) objMailbox.CreateMailbox "LDAP://" + DCServer + "/CN=Private MDB,CN=First Storage Group,CN=InformationStore,CN=" + Server + ",CN=Servers,CN=First Administrative Group, CN=Administrative Groups,CN=First Organization, CN=Microsoft Exchange,CN=Services, CN=Configuration," + DomainName move-storagegrouppath -identity “First Storage Group“ –log "C:\newlogPath” enable-mailbox -identity domain\FOO –database “First Storage Group\Private MDB” Partner Dmitry Sotnikov New Product Research Manager Quest Software Announcing : PowerShell V2 Community Technology Preview (CTP) Availability /Applicability The PowerShell V2 CTP is not for everyone Read this PowerShell Team blog entry: http://blogs.msdn.com/powershell/archive/2007/11/02/ctpwatch-this-space.aspx PowerShell V2 Themes Universal Code Execution Model GUI over PowerShell Production Scripting Community Feedback PowerShell V2 Themes • Commands, expressions and ScriptBlocks can be run • in the foreground or background • on one or more machines • over a LAN or a WAN • in unrestricted or restricted environments • using short or long connections • using impersonation or supplied credentials • initiated by user input or by events Universal Code Execution Model Features • Remoting • Mobile Object Model • Background Jobs • Restricted Runspaces • Eventing (coming soon) Universal Code Execution Model Features • New hosting APIs • Runspace pooling GUI over PowerShell Features • Graphical PowerShell • Script Cmdlets • Script Internationalization/Data Language • Debugging • Packages and modules (coming soon) Production Scripting Features • Language enhancements • Improved adapters • New/improved cmdlets Community Feedback Call To Action Download PowerShell CTP On non-production systems Kick the tires and let us know what we got right/wrong Let us know about any incompatibilities with V1 Invest and learn how to: Learn and leverage others work Discover the system Leverage utilities Formalize your work Methods apply to V1 and V2 In the box documents Release Notes Getting Started, Users Guide, Quick Reference Guide Help Discovery utilities Books Community Practice ad hoc development Utilities - Discovery Command Function Get-Help Help about PowerShell commands and topics Get information about anything that can be invoked Get-Command Get-Member Get-PSDrive Show what can be done with an object Shows what object stores are available Demo: Discovery Utilities Jeffrey P Snover Partner Architect Utilities – Object Manipulation Command Action Compare Group Measure Select Compare 2 sets of objects Split a set of objects into groups Measure some property of a set of objects Select a set of properties from a set of objects Sort Tee Where Sort objects Make a copy of a set of objects Select a subset of objects Demo: Object Manipulation Utilities Jeffrey P Snover Partner Architect Transformation and Output Commands Functions Format -Custom -List -Table -Wide Convert objects into formatting records Out -File -Host -Printer -String Convert formatting records into output-specific directives. Export/Import -CliXML -CSV Converts objects into and out of file formats ConvertTo -HTML Converts object into other objects Demo: Transformation and Output Utilities Jeffrey P Snover Partner Architect Instrumentation Text COM .NET Cmdlets Object types WMI XML ADO ADSI Demo: PowerShell Scripting Jeffrey P Snover Partner Architect Now available at: www.microsoft.com/downloads Search for PowerShell Try it, Deploy it, Use it, Share Automate and Prosper! Newsgroup: Microsoft.Public.Windows.PowerShell Team blog: http://blogs.msdn.com/PowerShell/ PowerShellCommunity.Org: http://www.PowershellCommunity.Org Channel 9 http://channel9.msdn.com/tags/PowerShell Wiki http://channel9.msdn.com/wiki/default.aspx/Channel9.WindowsPowerShellWiki Script Center: http://www.microsoft.com/technet/scriptcenter/hubs/msh.mspx CodePlex: http://codeplex.com/Project/ProjectDirectory.aspx?TagName=powershell Many excellent books Manning Press book by PowerShell Dev Lead Bruce Payette: PowerShell in Action http://manning.com/powershell/ O’Reilly book by PowerShell Dev Lee Holmes – Windows PowerShell Cookbook http://www.oreilly.com/catalog/9780596528492/index.html Questions? Complete an evaluation on CommNet and enter to win! © 2007 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. MICROSOFT MAKES NO WARRANTIES, EXPRESS OR IMPLIED, IN THIS SUMMARY. Access existing instrumentation Bind to COM objects $fso = New-Object -ComObject Scripting.FileSystemObject $m = [System.Runtime.InteropServices.Marshal] $word = $m::GetActiveObject("Word.Application") Invoke methods/access properties $fso.GetDrive(“C:”) $fso.VolumeName = “System Drive” Understand/extend instrumentation Extend and discover properties/methods Update-TypeData Office.Word.Types.ps1xml $fso | Get-Member Manipulate and format results Define and import custom formating Update-FormatData Office.Word.Format.ps1xml $word.RecentFiles | Sort name | Format-Table Allows more simpler/more powerful COM scripts because of utilities and formatting PowerShell provides native WMI support Get-WmiObject Allows for inspection of WMI namespace Get-WmiObject –list [-Namespace xx] Get-WmiObject –Class xx –Namespace xx –Property xxx – Filter xxx – ComputerName xxx –Credential xxx Native language support [WMI] “\\JPSDESK10\root\cimv2:Win32_Process.Handle="0“ [WMICLASS] "ROOT\cimv2:WIN32_PROCESS" [WMISEARCHER]"select * from Win32_process WHERE Name = 'calc.exe'" PowerShell provides native access to any .NET class Create any object [reflection.assembly]::LoadWithPartialName("System.Windows.Fo rms") $d = New-Object System.DateTime 2006,12,25 Access Properties/Invoke Methods $d.DayOfWeek $d.AddDays(-30) Access Statics [DateTime]::Now [DateTime]::IsLeapYear(2006) Allows admins to easily access and leverage a huge API set because of scriptability, utilities and formatting PowerShell provides native XML support Native datatype $x=[xml]"<a><b><c>TEST</c></b></a>“ $b =[xml](type c:\i386\mssecure.xml) Native syntax to access “data” view of properties $b.BulletinDataStore.Bulletins.Bulletin[0] Access to XML methods $b.BulletinDataStore.SelectNodes(“//Patch”) XML properties available through PSBase property $b.BulletinDataStore.PSBase.innerXml Invoke existing tools Existing command run directly after variables are expanded Harvest data from existing tools Parse output into variables using text utilities. Pipe data to SELECT and use –FIRST and –LAST Select-String <REGEX> <Path> Dir | Select-String <REGEX> [DateTime]”12/25/2006 7:00” ([DateTime]”12/25/2006 7:00”).AddDays(-30) Use functions/scripts to wrap the commands and convert output to objects or provide standard syntax Safely process text Use CLR types via Windows PowerShell to safely parse text [URI]” http://blogs.msdn.com/powershell/archive/2006/04/25/583234.aspx” Allows admins to get 2-10x more power out of existing commands because of scriptability