Как переработать IIS AppPool с помощью Powershell?
Я вообще не делал никаких сценариев Windows, поэтому я не понимаю, как это сделать. Во всяком случае, в основном мы хотим иметь script, который примет аргумент, по которому 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"'.
В любом случае, было бы неплохо, если бы я также знал, как отлаживать такие вещи. Я уже исправил одну ошибку с исходным script, выполнив 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 :
Ответы
Ответ 1
Где-Объект - это фильтр, который ожидает что-то как на входе. Кажется, что отсутствует pipe, перед фильтром где-то.
Try:
$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. Вышеописанный код обновлен.
Ответ 2
Используя данные из этого вопроса, я смог создать 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
При использовании get-WMIObject вы, вероятно, должны использовать -filter вместо piping для Where-Object. параметр filter использует язык синтаксиса WQL вместо PowerShell, поэтому не позволяйте этому затягивать вас.
$appPoolName = $args[0]
$appPool = get-wmiobject -namespace "root\MicrosoftIISv2" -class "IIsApplicationPools" -filter 'name="W3SVC/APPPOOLS/$appPoolName"'
Сказав, что помещение трубы должно работать, и, конечно же, облегчает работу, если вы уже не знаете WQL.
Ответ 4
Это не специфический для Powershell ответ, но iisapp.vbs будет перечислять запущенные пулы приложений, и есть флаг /r для утилизации определенного пула приложений.
Ответ 5
Вы также можете использовать WQL-запрос для получения только нужного AppPool; это имеет преимущество фильтрации результатов на стороне WMI, что особенно удобно при получении объектов с удаленной машины.
(Get-WmiObject -Query "SELECT * FROM IIsApplicationPool WHERE Name = 'W3SVC/AppPools/$appPoolName'" -Namespace 'root\MicrosoftIISv2').Recycle()
Ответ 6
С 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()