21

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           :
Frew Schmidt
  • 9,364
  • 16
  • 64
  • 86
  • 1
    Just a quick style note.. rather than using $args to get the app pool name, you could declare a named paramater. PowerShell scripts will take named parameters and fill them first by name and then by position. You can also specify a type for the parameter. Example: (param [string]$AppPoolName) – Steven Murawski Oct 13 '08 at 22:48
  • Curious if you got this going with the updated WMI class name suggestion made in my answer? – Scott Saad Oct 15 '08 at 00:13

8 Answers8

18

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.

Scott Saad
  • 17,962
  • 11
  • 63
  • 84
7

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 $_ }
Aliostad
  • 80,612
  • 21
  • 160
  • 208
Jason
  • 3,736
  • 5
  • 33
  • 40
  • I am very happy to find out some code I wrote is helping others. Thanks for the comment. It made my day. – Jason Jul 19 '13 at 15:56
4

When using get-WMIObject you should probably use -filter instead of piping to Where-Object. the filter parameter uses WQL syntax language instead of PowerShell's, so don't let that trip you up.

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

Having said that putting the pipe there should work, and certainly makes it easier to work with unless you already know WQL.

EdgeVB
  • 486
  • 2
  • 5
4

In Powershell:

$pool = Get-IISAppPool -Name <name>

$pool.recycle()
mvanle
  • 1,847
  • 23
  • 19
2

This isn't a Powershell-specific answer, but iisapp.vbs will list the running application pools, and there is a /r flag to recycle a specific app pool.

jwmiller5
  • 2,584
  • 1
  • 15
  • 34
1

You can also use a WQL query to get just the AppPool you want; this has the advantage of filtering the results on the WMI side, which is especially handy when getting objects from a remote machine.

(Get-WmiObject -Query "SELECT * FROM IIsApplicationPool WHERE Name = 'W3SVC/AppPools/$appPoolName'" -Namespace 'root\MicrosoftIISv2').Recycle()
Thomas S. Trias
  • 1,294
  • 9
  • 10
0

With IIS 8.0 I've found I had to use -namespace root\webadministration -class ApplicationPool

For example, to recycle an Application Pool in IIS 8 remotely using PowerShell:

As always, please test this first by listing the application pools. Just remove the | where and the first ( from the command:

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

And on one line:

(gwmi -comp WebSserver01 -namespace root\webadministration -class ApplicationPool | where {$_.Name -eq 'YourAppPool'}).recycle()
user4317867
  • 2,397
  • 4
  • 31
  • 57
0

For PS 3.0+, you can use CIM, which should be faster than WMI.

Invoke-CimMethod -Query 'SELECT * FROM ApplicationPool WHERE Name = "$appPoolName"' -Namespace root\WebAdministration -MethodName Recycle