Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I recycle an IIS AppPool with Powershell?

Tags:

I haven't really done any Windows scripting at all, so I am at a loss on how to pull this one off. Anyway, basically what we want to do is have a script that will take an argument on which IIS AppPool to recycle. I have done some research on Google and haven't had much success on getting things to work.

Here is what I am trying now:

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

and the error I get:

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

Anyway, it would be nice if I also knew how to debug things like this. I already fixed one bug with the original script by doing gwmi -namespace "root\MicrosoftIISv2" -list. Any other tips like that one would be great.

Thanks!

Update: Here is some more info

$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           : 
like image 423
Frew Schmidt Avatar asked Oct 13 '08 18:10

Frew Schmidt


People also ask

What is recycling IIS application pool?

What is application pool recycling in IIS? Recycling means that the worker process that handles requests for that application pool is terminated and a new one is started. This is generally done to avoid unstable states that can lead to application crashes, hangs, or memory leaks.


2 Answers

Where-Object is a filter that expects something as in input. There seems to be a missing pipe, before the where filter.

Try:

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

Edit: I noticed that the WMI class was IISApplicationPools, which as you saw, did not show us the Recycle method when piped to Get-Member. This needs to be changed to IISApplicationPool (non-plural). With that change, you are able to use the Recycle method. The code above has been updated.

like image 155
Scott Saad Avatar answered Sep 29 '22 04:09

Scott Saad


Using the data from this question I was able to create 2 very useful functions.

  • Get-IisAppPools
  • Recycle-IisAppPool

The code:

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'"   } 

You can use these functions like this

Recycle-IisAppPool DefaultAppPool Get-IisAppPools | ? { $_ -match "v4.0$" } | % { Recycle-IisAppPool $_ } 
like image 44
Jason Avatar answered Sep 29 '22 05:09

Jason