Note: This tip requires PowerShell 2.0 or above.
IIS lets you view all worker processes of a server when you double click the Worker Process tile in IIS manager (inetmgr.exe).
If you double click a process you will get the requests that are currently running inside that worker process. The information gives you a good view of the current requests but this is only good for the server you’re currently working. Using PowerShell you can get the information from multiple servers and view all requests in one view.
Using WMI we can get the worker processes of a server by getting the instances of the WorkerProcess class.
PS> Get-WmiObject WorkerProcess -Namespace root\WebAdministration -ComputerName IIS1 __GENUS : 2 __CLASS : WorkerProcess __SUPERCLASS : Object __DYNASTY : Object __RELPATH : WorkerProcess.ProcessId=4252 __PROPERTY_COUNT : 3 __DERIVATION : {Object} __SERVER : IIS1 __NAMESPACE : root\WebAdministration __PATH : \\IIS1\root\WebAdministration:WorkerProcess.ProcessId=4252 AppPoolName : SharePoint - mysite Guid : 0fb641ca-b913-4628-99ff-6ffd13ee4b52 ProcessId : 4252 PSComputerName : IIS1 __GENUS : 2 __CLASS : WorkerProcess __SUPERCLASS : Object __DYNASTY : Object __RELPATH : WorkerProcess.ProcessId=8512 __PROPERTY_COUNT : 3 __DERIVATION : {Object} __SERVER : IIS1 __NAMESPACE : root\WebAdministration __PATH : \\IIS1\root\WebAdministration:WorkerProcess.ProcessId=8512 AppPoolName : DefaultAppPool Guid : 0237506e-4924-45a8-b334-284202d83d8d ProcessId : 8512 PSComputerName : IIS1
If you pipe the result to the Get-Member cmdlet you will find a method called GetExecutingRequests.
PS> Get-WmiObject WorkerProcess -Namespace root\WebAdministration -ComputerName IIS1 TypeName: System.Management.ManagementObject#root\WebAdministration\WorkerProcess Name MemberType Definition ---- ---------- ---------- PSComputerName AliasProperty PSComputerName = __SERVER GetExecutingRequests Method System.Management.ManagementBaseObject GetExecutingRequests() GetState Method System.Management.ManagementBaseObject GetState() AppPoolName Property string AppPoolName {get;set;} Guid Property string Guid {get;set;} (...)
The GetExecutingRequests method lets you see the requests that were executing at the time that the method was run. Requests execute fast so you might get empty results when you execute the method. To restrict the result to a specific pool name, use the -Filter parameter.
Get-WmiObject WorkerProcess -Namespace root\WebAdministration -ComputerName IIS1 -Filter "AppPoolName='SharePoint - mysite'" | Invoke-WmiMethod -Name GetExecutingRequests __GENUS : 2 __CLASS : __PARAMETERS __SUPERCLASS : __DYNASTY : __PARAMETERS __RELPATH : __PROPERTY_COUNT : 1 __DERIVATION : {} __SERVER : __NAMESPACE : __PATH : OutputElement : {} PSComputerName : __GENUS : 2 __CLASS : __PARAMETERS __SUPERCLASS : __DYNASTY : __PARAMETERS __RELPATH : __PROPERTY_COUNT : 1 __DERIVATION : {} __SERVER : __NAMESPACE : __PATH : OutputElement : {mysite, mysite, mysite} PSComputerName :
The resultant objects you want to take a look at are the ones that have a value in the OutputElement property. The following is the result of the above highlighted OutputElement property:
__GENUS : 2 __CLASS : HttpRequest __SUPERCLASS : Object __DYNASTY : Object __RELPATH : __PROPERTY_COUNT : 14 __DERIVATION : {Object} __SERVER : __NAMESPACE : __PATH : ClientIPAddress : 10.10.10.10 ConnectionId : cf0000006001800f CurrentModule : ManagedPipelineHandler GUID : HostName : mysite LocalIPAddress : 11.11.11.11 LocalPort : 80 PipelineState : 128 SiteId : 1202063871 TimeElapsed : 1544 TimeInModule : 1529 TimeInState : 1529 Url : /Pages/Default.aspx Verb : GET PSComputerName : (...)
Using the following snippet you can create a custom object that captures the server name, application pool name and ID, and all relevant properties of the OutputElement object.
$wp = Get-WmiObject WorkerProcess -Namespace root\WebAdministration -ComputerName IIS1,IIS2,IIS3 foreach($w in $wp) { $w | Invoke-WmiMethod -Name GetExecutingRequests | Select-Object -ExpandProperty OutputElement | Foreach-Object{ [PSCustomObject]@{ AppPoolName = $w.AppPoolName ProcessId = $w.ProcessId ClientIPAddress = $_.ClientIPAddress CurrentModule = $_.CurrentModule HostName = $_.HostName LocalIPAddress = $_.LocalIPAddress LocalPort = $_.LocalPort SiteId = $_.SiteId Url = $_.Url Verb = $_.Verb PSComputerName = $w.__SERVER } } } AppPoolName : SharePoint - mysite ProcessId : 5080 ClientIPAddress : 10.10.10.10 CurrentModule : IIS Web Core HostName : mysite LocalIPAddress : 11.11.11.11 LocalPort : 80 SiteId : 1202063871 Url : /Pages/_layouts/IMAGES/MasterPages/Dropdown.png Verb : GET PSComputerName : IIS1