如何将IIS AppPools的应用程序放入阵列?

时间:2018-03-09 12:26:55

标签: windows powershell iis

要在IIS:\AppPools\中查看所有池及其状态和应用程序,我在PowerShell中使用以下命令:

Get-ChildItem –Path IIS:\AppPools\

此命令的输出分为3列,分别为" Name "," State "和" 应用程序&#34 ;;它看起来像这样的例子:

Name                     State        Applications
----                     -----        ------------
DefaultAppPool           Started      item
AnotherAppPool           Started      /item/item
AnotherAppPool2          Started      /item
AppPool XYZ              Started      item 1
                                      item 2
                                      item 3
...

我在这一点上的尝试是将上面命令的输出存储到一个数组中以便以后处理;因此我在PowerShell中编写了以下代码: (为了更好地理解,我注释了每一步)

Import-Module WebAdministration

# This array contains a hash table with the output of
# the command "Get-ChildItem –Path IIS:\AppPools\":
$MY_IIS_APPLICATION_POOL = @{};

# "$COUNT" contains index number for each hash table in
# "$MY_IIS_APPLICATION_POOL"; It'll increased during
# the foreach-loop at its end:
$COUNT = 0;

# Looping each record/line of the command, to get the
# needed informations out of the several columns:
foreach ($RECORD in (Get-ChildItem –Path IIS:\AppPools\)) {
  # Getting the needed records of each line:
  $POOL_NAME   = $RECORD.Name;
  $POOL_STATUS = $RECORD.State;
  $POOL_APPS   = "";

  # If there are more items in column "Applications":
  if ($RECORD.Applications -is [array]) {
    foreach ($APP in $RECORD.Applications) {
      $POOL_APPS = ($APP.ToString() + "," + $POOL_APPS);
    }
  } elseif ($RECORD.Applications -eq $NULL) {
    # Otherwise, if value is empty:
    $POOL_APPS = "---";
  } else {
    # Or if column contains only one value:
    $POOL_APPS = $RECORD.Applications.ToString();
  }

  # Defining Hash-Table in $MY_IIS_APPLICATION_POOL:
  $MY_IIS_APPLICATION_POOL[$COUNT] = @{
    'Name'   = $POOL_NAME;
    'Status' = $POOL_STATUS;
    'Apps'   = $POOL_APPS;
  };

  # Increase array index number for next hash table:
  $COUNT++;
}

这很有效 - 我可以通过此方案获取值$MY_ARRAY[0...9].Name或通过$MY_ARRAY[0...9].Status获取状态。但是我通过获取"应用程序"来获取空值。列:$MY_ARRAY[0...9].Apps始终为空。

那么有人知道如何从列中获取值"应用程序"?

1 个答案:

答案 0 :(得分:3)

Applications始终为空的原因是,这实际上不是所返回对象的属性。该数据是由webadministration模块中的output formatter在控制台输出中创建的。

如果将应用程序池对象通过管道传输到Get-Member,则可以查看可用的属性。您会注意到Applications作为成员不存在。如果您从Get-Member

获取全名
Microsoft.IIs.PowerShell.Framework.ConfigurationElement#system.applicationHost/applicationPools#add

您可以直接进入webadministration模块以进行更仔细的查看。通常您可以在C:\Windows\System32\WindowsPowerShell\v1.0\Modules\WebAdministration

上找到它

在模块内部,您将找到一个名为iisprovider.format.ps1xml的文件,该文件正在处理输出格式。如果弹出该打开并搜索类型名称,您将在Applications列中找到正在运行以产生输出的代码。 table列未命名,因此您只需数到第三列即可找到它。看起来像这样。

<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>

您可以将Get-ChildItem –Path IIS:\AppPools\的输出通过管道传送到Out-String,就像$appPoolText = Get-ChildItem –Path IIS:\AppPools\ | Out-String一样,然后对其进行解析,但这似乎需要很多工作。对于我的使用,我只是将格式化程序代码转换为可以使用的功能。

function GetAppsInPool($pn) {
    $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)
    }
}

然后可以从技术上将其与Select-Object一起使用,以创建具有计算属性的内联自定义对象,该属性看起来像您想要的样子。像

Get-ChildItem IIS:\AppPools\ | select Name,State,@{n='Applications';e={GetAppsInPool -pn $_.Name}}