Как переработать IIS AppPool с помощью Powershell? - PullRequest
21 голосов
/ 13 октября 2008

Я вообще не делал никаких скриптов для Windows, так что я не знаю, как это сделать. Во всяком случае, в основном мы хотим создать скрипт, который будет принимать аргумент для перезапуска IIS AppPool. Я провел некоторое исследование в Google и не добился большого успеха в том, чтобы заставить вещи работать.

Вот что я сейчас пытаюсь:

$appPoolName = $args[0]
$appPool = get-wmiobject -namespace "root\MicrosoftIISv2" -class "IIsApplicationPools" Where-Object {$_.Name -eq "W3SVC/APPPOOLS/$appPoolName"}
$appPool.Recycle()

и ошибка, которую я получаю:

Get-WmiObject : A parameter cannot be found that matches parameter name '$_.Name -eq "W3SVC/APPPOOLS/$appPoolName"'.

В любом случае, было бы неплохо, если бы я также знал, как отлаживать подобные вещи. Я уже исправил одну ошибку в оригинальном скрипте, выполнив gwmi -namespace "root \ MicrosoftIISv2" -list. Любые другие советы, как этот, было бы замечательно.

Спасибо!

Обновление : Вот еще немного информации

$appPool = gwmi -namespace "root\MicrosoftIISv2" -class "IISApplicationPools" | Get-Member

.   TypeName: System.Management.ManagementObject#root\MicrosoftIISv2\IIsApplicationPools

Name                MemberType   Definition
----                ----------   ----------
Caption             Property     System.String Caption {get;set;}
Description         Property     System.String Description {get;set;}
InstallDate         Property     System.String InstallDate {get;set;}
Name                Property     System.String Name {get;set;}
Status              Property     System.String Status {get;set;}
__CLASS             Property     System.String __CLASS {get;set;}
__DERIVATION        Property     System.String[] __DERIVATION {get;set;}
__DYNASTY           Property     System.String __DYNASTY {get;set;}
__GENUS             Property     System.Int32 __GENUS {get;set;}
__NAMESPACE         Property     System.String __NAMESPACE {get;set;}
__PATH              Property     System.String __PATH {get;set;}
__PROPERTY_COUNT    Property     System.Int32 __PROPERTY_COUNT {get;set;}
__RELPATH           Property     System.String __RELPATH {get;set;}
__SERVER            Property     System.String __SERVER {get;set;}
__SUPERCLASS        Property     System.String __SUPERCLASS {get;set;}
ConvertFromDateTime ScriptMethod System.Object ConvertFromDateTime();
ConvertToDateTime   ScriptMethod System.Object ConvertToDateTime();
Delete              ScriptMethod System.Object Delete();
GetType             ScriptMethod System.Object GetType();
Put                 ScriptMethod System.Object Put();


gwmi -namespace "root\MicrosoftIISv2" -class "IISApplicationPools"


__GENUS          : 2
__CLASS          : IIsApplicationPools
__SUPERCLASS     : CIM_LogicalElement
__DYNASTY        : CIM_ManagedSystemElement
__RELPATH        : IIsApplicationPools.Name="W3SVC/AppPools"
__PROPERTY_COUNT : 5
__DERIVATION     : {CIM_LogicalElement, CIM_ManagedSystemElement}
__SERVER         : IRON
__NAMESPACE      : root\MicrosoftIISv2
__PATH           : \\IRON\root\MicrosoftIISv2:IIsApplicationPools.Name="W3SVC/A
                   ppPools"
Caption          :
Description      :
InstallDate      :
Name             : W3SVC/AppPools
Status           :

Ответы [ 7 ]

18 голосов
/ 13 октября 2008

Где-объект - это фильтр, который ожидает что-то как на входе. Кажется, что отсутствует труба , перед , где фильтр .

Попробуйте:

$appPoolName = $args[0]
$appPool = get-wmiobject -namespace "root\MicrosoftIISv2" -class "IIsApplicationPool" | Where-Object {$_.Name -eq "W3SVC/APPPOOLS/$appPoolName"}
$appPool.Recycle()

Редактировать : я заметил, что класс WMI был IISApplicationPools , который, как вы видели, не показывал нам метод Recycle при передаче по каналу Get-Member, Это должно быть изменено на IISApplicationPool (не множественное число). С этим изменением вы можете использовать метод Recycle. Код выше был обновлен.

6 голосов
/ 28 апреля 2011

Используя данные этого вопроса, я смог создать 2 очень полезные функции.

  • Get-IisAppPools
  • Перезарядка-IisAppPool

Код:

function Get-IisAppPools {

    Get-WmiObject -Namespace "root\MicrosoftIISv2" -Class "IIsApplicationPool" -Filter 'name like "W3SVC/APPPOOLS/%"' 
         | ForEach-Object { $_.Name.ToString().SubString(15) } 

}

function Recycle-IisAppPool([string]$appPoolName) { 

     Invoke-WmiMethod -Name Recycle -Namespace "root\MicrosoftIISv2" -Path "IIsApplicationPool.Name='W3SVC/APPPOOLS/$appPoolName'" 

}

Вы можете использовать эти функции следующим образом

Recycle-IisAppPool DefaultAppPool
Get-IisAppPools | ? { $_ -match "v4.0$" } | % { Recycle-IisAppPool $_ }
3 голосов
/ 14 октября 2008

При использовании get-WMIObject вы, вероятно, должны использовать -filter вместо передачи в Where-Object. параметр фильтра использует язык синтаксиса WQL вместо языка PowerShell, поэтому не позволяйте этому сбить вас с толку.

$appPoolName = $args[0]
$appPool = get-wmiobject -namespace "root\MicrosoftIISv2" -class "IIsApplicationPools" -filter 'name="W3SVC/APPPOOLS/$appPoolName"'

Сказав, что установка канала там должна работать, и, безусловно, облегчает работу, если вы не знаете WQL.

2 голосов
/ 30 октября 2008

Это не специфичный для Powershell ответ, но iisapp.vbs перечислит пулы запущенных приложений, и есть флаг / r, чтобы перезапустить определенный пул приложений.

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

В Powershell:

$pool = Get-IISAppPool -Name <name>

$pool.recycle()
0 голосов
/ 21 марта 2016

В IIS 8.0 я обнаружил, что должен был использовать -namespace root\webadministration -class ApplicationPool

Например, чтобы удаленно перезапустить пул приложений в IIS 8 с помощью PowerShell:

Как всегда, сначала проверьте это, перечислив пулы приложений. Просто удалите | where и первый ( из команды:

gwmi -comp WebServer01 -namespace root\webadministration -class ApplicationPool

#Recycle app pool by name.
(gwmi -comp WebServer01 -namespace root\webadministration -class ApplicationPool | `
where {$_.Name -eq 'YourAppPool'}).recycle()

И в одной строке:

(gwmi -comp WebSserver01 -namespace root\webadministration -class ApplicationPool | where {$_.Name -eq 'YourAppPool'}).recycle()
0 голосов
/ 06 июля 2011

Вы также можете использовать WQL-запрос, чтобы получить только нужный вам AppPool; это дает преимущество фильтрации результатов на стороне WMI, что особенно удобно при получении объектов с удаленного компьютера.

(Get-WmiObject -Query "SELECT * FROM IIsApplicationPool WHERE Name = 'W3SVC/AppPools/$appPoolName'" -Namespace 'root\MicrosoftIISv2').Recycle()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...