iispowershellapplication-pool

PowerShell: retrieve number of applications in AppPool


How to retrieve the number of applications associated with a specific IIS AppPool via PowerShell command?

We can see the associated applications manually using:

Get-Item IIS:\AppPools\AppPoolName

However, if we manually want to select the Applications column, it is not possible. Also, the Applications column is not listed within | Get-Member *.

  1. Why is the column not listed?
  2. How to find the number of applications associated with a specific IIS AppPool using PowerShell?

Solution

  • The trick is: PowerShell established so-called "view definition files" which tell PowerShell how to format objects (e.g. whether the object is formatted as a a list or a table, which columns are displayed, etc.). Those files can be found at C:\Windows\System32\WindowsPowerShell\v1.0 and are all ending in .format.ps1xml.

    To answer the original question: The file C:\Windows\System32\WindowsPowerShell\v1.0\Modules\WebAdministration\iisprovider.format.ps1xml contains the view definition for the AppPool type which defines a calculated column looking like this:

    <TableColumnItem>
     <ScriptBlock>
        $pn = $_.Name
        $sites = get-webconfigurationproperty "/system.applicationHost/sites/site/application[@applicationPool=`'$pn`'and @path='/']/parent::*" machine/webroot/apphost -name name
        $apps = get-webconfigurationproperty "/system.applicationHost/sites/site/application[@applicationPool=`'$pn`'and @path!='/']" machine/webroot/apphost -name path
        $arr = @()
        if ($sites -ne $null) {$arr += $sites}
        if ($apps -ne $null) {$arr += $apps}
        if ($arr.Length -gt 0) {
          $out = ""
          foreach ($s in $arr) {$out += $s.Value + "`n"}
          $out.Substring(0, $out.Length - 1)
        }
      </ScriptBlock>
    </TableColumnItem>
    

    This answers why the column itself is not a member of the AppPool type. The second question can be easily answered now extracting the necessary code from the "scriptlet" above:

    $applicationsInAppPoolCount = @(Get-WebConfigurationProperty `"/system.applicationHost/sites/site/application[@applicationPool=`'$appPool`'and @path!='/']"` "machine/webroot/apphost" -name path).Count