Powershell Invoke-Command и IISConfigCollection - PullRequest
0 голосов
/ 24 октября 2018

Я хочу получить информацию о пулах приложений IIS с другого сервера.

Это должно быть возможно с помощью Invoke-Command.Но есть поведение, которое я не понимаю ...

Когда я выполняю на локальной машине, блок скрипта выглядит следующим образом:

# get the values recorded under Recycle
$ConfigSection = Get-IISConfigSection -SectionPath "system.applicationHost/applicationPools"
$SitesCollection = Get-IISConfigCollection -ConfigElement $ConfigSection
$Site = Get-IISConfigCollectionElement -ConfigCollection $SitesCollection -ConfigAttribute @{"name" = "$AppPool"}
$recycling = Get-IISConfigElement -ConfigElement $Site -ChildElementName "recycling"
$flags = $recycling.Attributes["logEventOnRecycle"].Value

$onRecycle = @{
    'Time'           = [bool]($flags -band 1)     # Specific Time
    'Requests'       = [bool]($flags -band 2)     # Request Limit Exceeded
    'Schedule'       = [bool]($flags -band 4)     # Regular Time Interval
    'Memory'         = [bool]($flags -band 8)     # Virtual Memory Limit Exceeded
    'IsapiUnhealthy' = [bool]($flags -band 16)    # Isapi Reported Unhealthy
    'OnDemand'       = [bool]($flags -band 32)    # Manual Recycle
    'ConfigChange'   = [bool]($flags -band 64)    # Application Pool Configuration Changed
    'PrivateMemory'  = [bool]($flags -band 128)   # Private Memory Limit Exceeded
}

Это работает, я могу использовать это как "$onRecycle.Time" ...

Но нет, я хочу получить информацию с удаленного компьютера.

Моей первой мыслью было просто обернуть все это в переменную $ command.Конечно, это не сработало. Он генерирует следующие ошибки:

  • Невозможно проверить аргумент параметра 'ConfigElement'.Аргумент нулевой.Укажите допустимое значение для аргумента и попробуйте снова запустить команду.

  • Невозможно индексировать в пустой массив.

Тогда я думал, что плохо сделаю это шаг за шагом.Начиная с:

$s = "chvmes01"    
$command1 = { Get-IISConfigSection -SectionPath "system.applicationHost/applicationPools" }
    $ConfigSection = Invoke-Command -ComputerName $s -ScriptBlock $command1

Это работает и получает необходимую информацию, но уже на следующем шаге снова возникают проблемы:

$command2 = { param($ConfigSection)(Get-IISConfigCollection -ConfigElement $ConfigSection) }
$SitesCollection = Invoke-Command -ComputerName $s -ScriptBlock $command2 -ArgumentList $ConfigSection

Здесь я пытаюсь включить переменную $ ConfigSection, ноон возвращает мне следующую ошибку:

Невозможно связать параметр 'ConfigElement'.Не удается преобразовать значение «Microsoft.Web.Administration.ConfigurationSection» типа «Deserialized.Microsoft.Web.Administration.ConfigurationSection» в тип «Microsoft.Web.Administration.ConfigurationElement".

Я подумал, что возможнопричина в том, что мне нужно Import-Module WebAdministration, но это не имеет никакого эффекта.Все та же ошибка .. Поскольку уже второй шаг не работает, я не могу продолжить ..

Есть идеи?

Ответы [ 3 ]

0 голосов
/ 24 октября 2018

Предложение : Вы можете использовать команду Enter-PsSession для входа в удаленный компьютер, а затем выполнять команды там.

Enter-PSSession -ComputerName "Remote-Computer-name "

** ваши команды как локальные.

0 голосов
/ 25 октября 2018

Теперь я нашел решение для моей проблемы, благодаря @Kirill Pashkov, который привел меня в правильном направлении!

Теперь это выглядит так:

$s = "chvmes01"
$AppPool = "DefaultAppPool"       

$command1 = {
param($AppPool)
Get-IISConfigSection -SectionPath "system.applicationHost/applicationPools" |
Get-IISConfigCollection |
Get-IISConfigCollectionElement -ConfigAttribute @{"name" = $AppPool} |
Get-IISConfigElement -ChildElementName "recycling"
}

$recycling = Invoke-Command -ComputerName $s -ScriptBlock $command1 -ArgumentList $AppPool

$flags = Invoke-Command -ComputerName $s -ScriptBlock {param($recycling)$recycling.RawAttributes.logEventOnRecycle} -ArgumentList $recycling

$command2 = {
    param($flags)
    @{
    'Time'           = [bool]($flags -band 1)     # Specific Time
    'Requests'       = [bool]($flags -band 2)     # Request Limit Exceeded
    'Schedule'       = [bool]($flags -band 4)     # Regular Time Interval
    'Memory'         = [bool]($flags -band 8)     # Virtual Memory Limit Exceeded
    'IsapiUnhealthy' = [bool]($flags -band 16)    # Isapi Reported Unhealthy
    'OnDemand'       = [bool]($flags -band 32)    # Manual Recycle
    'ConfigChange'   = [bool]($flags -band 64)    # Application Pool Configuration Changed
    'PrivateMemory'  = [bool]($flags -band 128)   # Private Memory Limit Exceeded
    }
}

$onRecycleLog = Invoke-Command -ComputerName $s -ScriptBlock $command2 -ArgumentList $flags

Наконец я получилПравильный вывод сохранен в переменной $ onRecycleLog, которая выглядит следующим образом: enter image description here

Спасибо, Кирилл, за вашу поддержку!

0 голосов
/ 24 октября 2018

Командлет Get-IISConfigCollection получает объект ConfigurationCollection из ConfigurationSection или ConfigurationElement.

Желательно не назначать это значение параметру и передавать его в конвейер.к следующему командлету, поскольку Windows PowerShell не может интерпретировать этот объект.Это связано с тем, что ConfigurationCollection реализует IEnumarable и конвейерный процессор перечисляет каждый отдельный элемент при использовании таким способом.Вместо этого либо передайте весь командлет Get-IISConfigCollection в конвейер, либо передайте его в качестве параметра.

Пример:

$ScriptBlock= { Get-IISConfigSection -SectionPath "system.applicationHost/applicationPools" | Get-IISConfigCollection }
$SitesCollection = Invoke-Command -ComputerName $s -ScriptBlock $ScriptBlock
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...