Powershell-Day1

Post on 02-Aug-2015

16 views 0 download

Tags:

Transcript of Powershell-Day1

POWERSHELL

- Rajkumar - Nikhil Sureka

Contents…• Introduction to Windows PowerShell™

Introduction to Windows PowerShell Installing Windows PowerShell in Windows Server 2008Lab1 - Implementing Windows PowerShell

• Overview of Windows PowerShell™Overview of ObjectsWorking with CmdletsTab Expansion, Aliases, and HistoryUsing Variables and TypesLab2 - Lab: Working with Windows PowerShell Cmdlets,

Aliases, Objects and Variables

• Windows PowerShell™ is a command-line shell and scripting language designed especially for system administration. Built on the Microsoft .NET Framework, Windows PowerShell helps IT professionals control and automate the administration of Windows® operating systems and applications that run on Windows.

History of PowershellWindows Powershell is a Microsoftcommand-line shell and scripting language.

It was first introduced in 2003. It’s initial codename was “MONAD” which stood for

Microsoft shell (MSH)

History of Powershell

The first official release was in 2006 which is when the name was changed from MONAD to Powershell.

• v1.0 runs on Windows XP and Vista• v2.0 runs on Windows 7 (and comes pre-

installed)

It is available for both 32 bit and 64 bit platforms.

Introduction to Windows PowerShell• Download http://support.microsoft.com/kb/968929

Windows Management Framework (Windows PowerShell 2.0, Windows Remote Management (WinRM) 2.00, and Background Intelligent Transfer Service (BITS) 4.0)

• Download PowerShell from Microsoft's site http://www.microsoft.com/windowsserver2003/technologies/management/powershell/download.mspx

• Download .NET Framework PowerShell is an object based scripting language; consequently, it needs .NET Framework for the definitions of the Windows objects. PowerShell works fine with either .NET Framework v 2.0, or v 3.0. Search Microsoft’s site for:

• Presently, Microsoft Windows programmers have several options when it comes to scripting. They can use:

1. MS-DOS (or CMD) to create simple batch files2. VBScript for more complex programming3. PowerShell to make the most of the .NET framework

• With one of the above or a combination of all, a programmer gets complete control of all of the objects on a Windows computer.

Windows Scripting Languages

• A cmdlet is a lightweight command that is used in the Windows PowerShell environment.

• Cmdlets follow a verb-noun naming pattern. Examples of verbs: get, set, newExamples of nouns: service, item, date

Windows Powershell Cmdlets

Overview of Windows PowerShell

The .NET™ framework is leveraged and provides access to thousands of objects.The .NET™ framework is leveraged and provides access to thousands of objects.üü

Windows PowerShell 2.0 is included with Windows® 7 and supports existing scripts and command-line tools.Windows PowerShell 2.0 is included with Windows® 7 and supports existing scripts and command-line tools.üü

Cmdlets are available for performing common system and administration tasks.Cmdlets are available for performing common system and administration tasks.üü

Windows PowerShell 2.0 accepts and returns .NET objects which can be directly manipulated or sent to other tools or databases.Windows PowerShell 2.0 accepts and returns .NET objects which can be directly manipulated or sent to other tools or databases.üü

An extensible interface enables enterprise developers to build custom tools and utilities to administer their software. An extensible interface enables enterprise developers to build custom tools and utilities to administer their software. üü

ProductivityExchange 2003 (VBScript) E12 (Monad Script)

Mailbox Statistics

Set listExchange_Mailboxs = GetObject("winmgmts:{impersonationLevel=impersonate}!\\COMPUTERNAME\ROOT\MicrosoftExchangeV2").InstancesOf("Exchange_Mailbox")

For Each objExchange_Mailbox in listExchange_MailboxsWScript.echo "AssocContentCount =” + objExchange_Mailbox.AssocContentCountWScript.echo " DateDiscoveredAbsentInDS =” + objExchange_Mailbox.DateDiscoveredAbsentInDSWScript.echo " DeletedMessageSizeExtended =” + objExchange_Mailbox. DeletedMessageSizeExtendedWScript.echo " LastLoggedOnUserAccount =” + objExchange_Mailbox. LastLoggedOnUserAccountWScript.echo " LastLogoffTime =” + objExchange_Mailbox. LastLogoffTimeWScript.echo " LastLogonTime =” + objExchange_Mailbox. LastLogonTime WScript.echo " LegacyDN =” + objExchange_Mailbox. LegacyDNWScript.echo " MailboxDisplayName =” + objExchange_Mailbox. MailboxDisplayNameWScript.echo " MailboxGUID =” + objExchange_Mailbox. MailboxGUID WScript.echo " ServerName =” + objExchange_Mailbox. ServerName WScript.echo " Size =” + objExchange_Mailbox. SizeWScript.echo " StorageGroupName =” + objExchange_Mailbox. StorageGroupName WScript.echo " StorageLimitInfo =” + objExchange_Mailbox. StorageLimitInfo WScript.echo " StoreName =” + objExchange_Mailbox. StoreName WScript.echo " TotalItems =” + objExchange_Mailbox. TotalItems Next

get-mailboxstatistics –server $servername

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)

move-storagegrouppath -identity “First Storage Group“ –log "C:\newlogPath”

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

enable-mailbox -identity domain\FOO –database “First Storage Group\Private MDB”

Overview of the Windows PowerShell 2.0 Integrated Scripting Environment (ISE)

The ISE enables you to run commands and design, write, test, and debug scripts in a Windows GUI

Command pane

Output pane

Script pane

Multiple tabs, each with its own command, output, and script pane

Using the Windows PowerShell ISE Editor

Windows PowerShell ISE Profile– ISE has its own Windows PowerShell profile, Microsoft.PowerShell_ISE_profile.ps1– You can store functions, aliases, variables, and commands

that you use in Windows PowerShell ISE in this profile

Start the Windows PowerShell ISE:• From the Start menu, point to All Programs, point to Windows PowerShell 2.0, and then click

Windows PowerShell ISE.• In the Windows PowerShell console, type “Cmd.exe”, or in the Run box, type

“powershell_ise.exe”.

Start the Windows PowerShell ISE:• From the Start menu, point to All Programs, point to Windows PowerShell 2.0, and then click

Windows PowerShell ISE.• In the Windows PowerShell console, type “Cmd.exe”, or in the Run box, type

“powershell_ise.exe”.

üü

Customize the Windows PowerShell ISE by:

• Moving and resizing the Command pane, Output pane, and Script pane• Showing or hiding the Script pane• Changing the text size in all panes of Windows PowerShell ISE

Customize the Windows PowerShell ISE by:

• Moving and resizing the Command pane, Output pane, and Script pane• Showing or hiding the Script pane• Changing the text size in all panes of Windows PowerShell ISE

üü

You can run any Windows PowerShell expression or command in Windows PowerShell ISE

WinRM - Windows PowerShell Remoting

Two types of remoting:– Fan-out remoting: provides one-to-many remoting to run scripts across multiple computers from

a single console– One-to-one interactive remoting: provides the ability to remotely troubleshoot a specific

computer

Remoting features of Windows PowerShell are built on Windows Remote Management (WinRM)Remoting features of Windows PowerShell are built on Windows Remote Management (WinRM)üü

Run an individual command, or create a persistent connection or session to run a series of commandsRun an individual command, or create a persistent connection or session to run a series of commandsüü

Remote administration is also known as remotingRemote administration is also known as remotingüü

Connecting to a Remote ComputerTwo ways to create a connection to a remote computer:

Create a temporary connection• You can start an interactive session by using the Invoke-Command cmdlet with the

ComputerName parameter.• A temporary connection is created for the command and closes the connection when the

command completes.

Create a persistent connection• Open a new Windows PowerShell session (PSSession) on the remote computer, then connect

to the computer and enter the session.– The New-PSSession cmdlet creates the PSSession.– The Enter-PSSession cmdlet connects you to the PSSession.

• You can run as many commands as desired during the session.• You must manually close the PSSession by using the Exit-PSSession cmdlet.

How Remote Commands Are Processed1. Local computer sends the Windows PowerShell

command to the remote computer using the WinRM protocol

2. Command runs in Windows PowerShell on the remote computer

3. Command results are sent back using the WinRM protocol and appear in Windows PowerShell on the local computer

All of the local input to a remote command is collected before any of it is sent to the remote computer.

The output is returned to the local computer as it is generated.

üü

üü

Running Remote Commands

To run commands in a PSSession:– Use the Session parameter of the Invoke-Command cmdlet to specify the session– Use the ComputerName parameter to retrieve objects from remote computers

To run a remote command on multiple computers:– Use the Invoke-Command for temporary connections and multiple computer names– Use the Session parameter for persistent connections and multiple PSSessions– Type the name of each computer in the ComputerName parameter of the Invoke-

Command

To run a local script on remote computers– Use the FilePath parameter of the Invoke-Command cmdlet

Discovering PowerShell

• PowerShell provides a discoverable environment. If you don’t know something or do not remember – browse around:

• Most of the commands support wildcards

Get-Help (help)Get-Command (gcm)Get-PSDrive (gdr)Get-Member (gm)

PS C:\> get-command *snapin*

• An alias is an alternative name assigned to a Cmdlet.

• Aliases allow users to quickly interact with the shell.

• The Cmdlet get-alias is used to list all built-in aliases as shown in the diagram on the next slide:

PowerShell Aliases

• They are .NET programs used to provide easy access to information external to the shell environment in order for the users to view it and manage it.

• To obtain a listing of all the providers, the Get-PSProvider cmdlet is used.

• To work with specific providers, use the set-location cmdlet then specify the provider drive.

Powershell Providers

• There are seven types of providers namely:

1. Alias - Provides access to the windows PowerShell aliases and their valuesGet-PSProviderSl Alias:\GCI | where-object {$_.name –like “s*”}

2. Environment - Provides access to the Windows environment variables.

3. FileSystem - Provides access to files and directories.

4. Function - Provides access to the functions defined in Windows PowerShell.

Powershell Providers

5. RegistryProvides access to the system registry keys and values.

6. Variable Provides access to Windows PowerShell variables and their values.

7. CertificateProvides read-only access to certificate stores and certificates.

Powershell Providers cont….

Variables

• Your Own Variables• "Automatic“- PowerShell Variables• Environment Variables• Drive Variables• Scope of Variables• Variable Types and "Strongly Typing"• Variable Management: Behind the Scenes

Variable Name

• You can use virtually any variable name you choose, names are not case sensitive.

• But, there are illegal characters such as; ! @ # % & , . and spaces. PowerShell will throw an error if you use an illegal character.

Variable Type

• Powershell variable type is base on .NET Framework.

• Common variable is as below:– [adsi], [array], [bool], [byte], [char]– [datetime], [decimal], [double]– [int] or [int32], [long] – [single], [scriptblock], [string]– [WMI], [WMIclass], [xml]

Your Own Variables• PowerShell creates new variables automatically so there is no need to

specifically "declare" variables. Simply assign data to a variable. The only thing you need to know is that variable names are always prefixed with a "$“

• # Create variables and assign to values$amount = 120$VAT = 0.19

# Calculate:$result = $amount * $VAT

# Output result$result

22.8• # Replace variables in text with values:

$text = "Net amount $amount matches gross amount $result"$text

Net amount 120 matches gross amount 142.8

Exchanging the Contents of Variables

• $Value1 = 10$Value2 = 20$Temp = $Value1$Value1 = $Value2$Value2 = $Temp

• $Value1 = 10; $Value2 = 20$Value1, $Value2 = $Value2, $Value1

• PowerShell keeps a record of all variable assignments, which is accessible via a virtual drive called variable:

• Dir variable:value* Name Value

---- -----value2 20value1 10

• Verify Whether a Variable Exists Test-Path variable:\value2

True

• $listing = Get-ChildItem c:\ $listing

• Directory: Microsoft.PowerShell.Core\FileSystem::C:\

Mode LastWriteTime Length Name---- ------------- ------ ----d---- 06.26.2007 15:36 2420d---- 05.04.2007 21:06 ATId---- 08.28.2006 18:22 Documents and settingsd---- 08.08.2007 21:46 EFSTMPWPd---- 04.28.2007 02:18 perflogs(...)

# Populate several variables with the same value in one step:$a = $b = $c = 1

Cmdlets for Variable…

Write-Protecting Variables: Creating Constants

• New-Variable test -value 100 -description `"test variable with write-protection" -option ReadOnly

• $test 100• $test = 200

The variable "test" cannot be overwritten since it is a constant or read-only.At line:1 char:6+ $test <<<< = 200

• del variable:\test -force

Constant Variable…• If you need strong protection like in traditional constants, you should create a

variable with the Constant option. This will change the variable to a proper constant that may neither be modified nor deleted. Only when you quit PowerShell are constants removed. Variables with the Constant option may only be created with New-Variable.

• New-Variable test -value 100 -description `"test variable with copy protection" -option Constant

New-Variable : A variable named "test" already exists.At line:1 Char:13+ New-Variable <<<< test -value 100 -description "test variable with copy protection" -option Constant

Automatic Variables….

• PowerShell uses variables, too, for internal purposes and calls those "automatic variables.“

• To understand the meaning of automatic variables, you can simply view their description:

Dir variable: | Sort-Object Name | Format-Table Name, Description -autosize –wrap

Name Description ---- ----------- $ ? Execution status of last command. ^

_

Environment Variables

• Reading Particular Environment Variables $env:windir C:\Windows• Searching for Environment Variables

Dir env:

Deleting and Modifying Environment Variables

• del env:\windir• $env:OS = "Apple MacIntosh OS X"

Dir env:

# The folder is now added to the path environment:$env:path += ";C:\myTools"

Scope of Variables

All Variables are Object

• [int]$Age=22• $Age.GetType()• $Age GetType().Name• $Age | Get-Member• $Title=“manager”• $Title.length• $Title.CompareTo()

PSDrive

PSDrive Operation

• Get-PSDrive• mount -Name Seting -psProvider FileSystem -

Root "C:\Documents and Settings”• mount -Name MS -PSProvider Registry -Root

HKLM\Software\Microsoft• rdr -Name MS• Set-Location• Get-Location

Powershell Operator

Arithmetic Binary Operators +, -, *, \, %, ++, --

Assignment Operators =, +=, -=, *=, /=, %=

Logical Operators !, -not, -and, -or

String Operators +, *, -f, -replace, -match, -like

Comparison Operators -eq, -ne, -gt, –ge, -lt, –le

Arithmetic Binary Operators

• 123+789 ; 222-876• 34.5*44.2 ; 13/7• 123%5• $var++ ; ++$var $var = $var + 1• $var-- ; --$var $var = $var – 1

Assignment Operators

• $var=3• $var+=3 ; $var-=3• $var*=3 ;$var/=3 ; $var%=3• $var = 0x10 echo $var 16• $var = 7.56e3 echo $var 7560• $var=7MB echo $var 7340043 (bytes)

Logical Operators

• (7 -eq 7) -and (2 -eq 5)• (7 -eq 7) -or (2 -eq 5)• (9 -eq 9) -xor (4 -eq 4) ; (9 -eq 9) -xor (4 -eq 7)• (3 -eq 3) -and !(2 -eq 2)• (3 -eq 3) -and -not (2 -eq 9)

String Operators-like ; -clike ; -ilike To be like as

-notlike ; -cnotlike ;-inotlike To not be like as

-match ; -cmatch ;-imatch Match

-notmatch ; -cnotmatch ; -inotmatch Not match

-contains ; -ccontains ; -icontains Include

-notcontains; -cnotcontains ;

-inotcontains

Not include

Comparison Operators

• -le ; -cle ; -ile <=• -eq; -ceq; -ieq =• -ne; -cne; -ine !=• -gt; -cgt; -igt >• -ge; -cge; -ige >=• -lt; -clt; -ilt <• -le; -cle; ile <=

Loop and Flow Control

• If…. elseif… else…• Switch…… default• ForEach( Foreach-Object)• For • While• Do….. While• Do…..Until• Break & Continue

If…. elseif… else…

If (< statement 1>) { < code 1> } Elseif (< statement 2>) { < code 2> … } Else { <code n> }

Switch…… default

Switch [-regex|-wildcard|-exact][-casesensitive] -file <filename> (< variable >)

{ < Pattern 1> { code 1 } < Pattern 2> { code 2 } < Pattern 3> { code 3 } … Default { code n } }

ForEach( Foreach-Object)ForEach ($<item or object> in $<Collection object>) { <code> }

dir | ForEach -process { $_.length / 1024}

For

For (<initial>; < statement >; < count>) {<code>

}

Foreach Loop

1) foreach ($number in 1,2,3,4,5,6,7,8,9,10,11,12 ) { $number * 7}

2) foreach ($number in 1... 12) {$number * 7}

3)$NumArray = (1,2,3,4,5,6,7,8,9,10,11,12) foreach ($number in $numArray ) { $number * 7}

4) $NumArray = (1.. 12) foreach ($number in $numArray ) { $number * 7}

While, do while, do until

• While (< statement >) {<code> }

• Do { < code >} While (< statement >)

• Do {<code>} Until (<statement>)

ps. “Until” can wait something happen!!

While, Do While, Do Until

• While Loops- $i =7; while ($i -le 85) { $i; $i +=7 }

• Do While Loop- $i = 7; do {$i; $i +=7} while ($i -le 85)

• Do Until - $i = 7; do {$i; $i +=7} until ($i -gt 85)

Break; Continue

• For ($i = 1; $i -le 10; $i++) {Write-Host $iIf ($i -eq 5) { Write-Host "BREAK!!“Break } }

• ForEach ($i in 1..10) {If ($i % 2) {

Continue }$i }

Cmdlets

• PSSnapin (subclass)– Default – registers all Cmdlets– CustomPSSnapin – register specific Cmdlets

• Parameters and Parameter Sets• Begin/End/StopProcessing• ProcessRecord

• WriteObject and WriteError

Cmdlets

• The majority of the PowerShell functionality comes from Cmdlet’s

• Always in Verb-Noun format and never plural (Get-WmiObject or Get-Process)

• Cmdlet’s return objects not text• Retrieve list of Cmdlet’s (Get-Command)• Can tab complete

• Below are sample Cmdlets following the verb-noun naming pattern:

PS C:\>get-childitem C:\(Gets the items and child items in one or more specified locations.)

PS C:\>get-service(Retrieve information about the services installed on your computer.)

PS C:\>set-location D:\ (It enables you to specify a new working location.)

PS C:\> set-location “c:\my documents”

Sample Powershell Cmdlets

• Get-Help(get-help set-* gives all cmdlets that start with Set-.)

• Get-Command (you’ll get back a list of all the Windows PowerShell cmdlets)

• Get-Member(will enumerate the properties and methods of that object.)

• Get-Psdrive (Gets the Windows PowerShell drives in the current session)

• Format-List(each property is displayed on a separate line)

5 key powershell commands

Showing processes

Getting help on commands

Stopping a process(es)

Script Security Settings - Execution Policy

• Restricted – No scripts can be run. Windows PowerShell can be used only in interactive mode.

• AllSigned – Only scripts signed by a trusted publisher can be run.

• RemoteSigned – Downloaded scripts must be signed by a trusted publisher before they can be run.

• Unrestricted – No restrictions; all Windows PowerShell scripts can be run.

• Use the Get-ExecutionPolicy cmdlet to retrieve the current effective script execution policy.

• Use the Set-ExecutionPolicy cmdlet to change the script execution policy to unrestricted as shown below:Set-ExecutionPolicy unrestricted

Setting script execution policy

• One of the most powerful and possibly confusing aspects of PowerShell.

• The output of one program can be the input to another

• Pipelining is passing data and objects from one cmdlet to another in a very robust fashion.

• A | B | C meaning the output of A goes to B, and the output of B goes to C.

Pipelining

PS C:\> Get-Process | where { $_.handlecount -gt 400 } | Format-List

This example is actually executing three cmdlets

1. The first, Get-Process, returns a list of all running processes

2. The second, Where {..} will return the conditioned value which handlecount is greater than 400.

3. Finally the Format-list will display the results in Alphabetic order

Pipelining Example

PS C:\> Get-Process | where { $_.handlecount -gt 400 } | Format-List

ProcessName : csrssId : 1080ProcessName : explorerId : 1952ProcessName : GrooveId : 2656ProcessName : inetinfoId : 1524

Pipelining Example Output

• The sort-object cmdlet is used to produce a listing of items in ascending/descending order

Get-EventLog system -newest 5 | Sort-Object eventid

Produces the output below:

Sorting

• Running a script can be done either within or outside PowerShell.

• Running the script within PowerShell requires the following steps:

1. Type the full path to the script2. Include the name of the script3. Ensure you include the PS1 extension

C:\mytest\RetrieveAndSortServiceState.PS1

Running windows powershell scripts

• Running scripts outside PowerShell requires the following steps:

1. Type the full path to the script2. Include the name of the script3. Ensure you include the PS1 extension4. Feed this to the PowerShell.exe program5. Use the –noexit argument to keep the PowerShell console

after script execution

Powershell –noexit C:\mytest\RetrieveAndSortServiceState.PS1

Running windows powershell scripts

Utilities – Object ManipulationCommand ActionCompare Compare 2 sets of objectsGroup Split a set of objects into groupsMeasure Measure some property of a set of objectsSelect Select a set of properties from a set of objectsSort Sort objectsTee Make a copy of a set of objectsWhere Select a subset of objects

Utilities - DiscoveryCommand FunctionGet-Help Help about PowerShell commands and

topicsGet-Command Get information about anything that can be

invokedGet-Member Show what can be done with an objectGet-PSDrive Shows what object stores are available

Transformation and OutputCommands 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

• Files and FoldersNew-Item is a quick and easy way to create a new file or folder on your computer.

Creating a file:New-Item c:\scripts\new_file.txt -type file

Creating a folder:New-Item c:\scripts\Windows PowerShell -type directory

Creating new items using Scripts

$intFolders = 10$intPad$i = 1New-Variable -Name strPrefix -Value "testFolder" -Option constant

do { if ($i -lt 10) {$intPad=0 new-item -path c:\mytest -name $strPrefix$intPad$i -type

directory} else {new-item -path c:\mytest -name $strPrefix$i -type

directory} $i++ }until ($i -eq $intFolders+1)

Creating multiple folders

$intFolders = 10$intPad$i = 1New-Variable -Name strPrefix -Value "testFolder" -

Option constant

do { if ($i -lt 10) {$intPad=0 Remove-item -path c:\mytest\$strPrefix$intPad$i} else {Remove-item -path c:\mytest\$strPrefix$i} $i++ }until ($i -eq $intFolders+1)

Deleting multiple folders

Scripting with COMAccess 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 instrumentationExtend and discover properties/methods

Update-TypeData Office.Word.Types.ps1xml$fso | Get-Member

Manipulate and format resultsDefine 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

• It is a hierarchical namespace, in which the layers build on one another like a Lightweight Directory Access Protocol (LDAP) directory used in Active Directory, or the file system structure on a hard disk drive.

• WMI can be used to: report on drive configuration, report on available memory both physical and virtual, back up the event log, modify registry, schedule tasks, share folders, switch from a static to a dynamic IP address.

• The WMI model has three sections namely:1. Resources2. Infrastructure 3. Consumers

Windows Management Instrumentation(WMI) Model

Scripting with WMIPowerShell provides native WMI supportGet-WmiObject

Allows for inspection of WMI namespaceGet-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'"

Scripting with .NETPowerShell provides native access to any .NET classCreate any object

[reflection.assembly]::LoadWithPartialName("System.Windows.Forms")$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

Scripting with XMLPowerShell provides native XML supportNative 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

Calling into .NET framework

• Use .NET types in your scripts

• Call into .NET directly

PS C:\> [System.Reflection.Assembly]:: LoadWithPartialName("System.Windows.Forms")PS C:\> [System.Windows.Forms.MessageBox]::Show("Hello“)

PS C:\> echo $([DateTime]::Now)