Winapi 使用PowerShell回收IIS应用程序池;调用“回收”时出现异常;

Winapi 使用PowerShell回收IIS应用程序池;调用“回收”时出现异常;,winapi,powershell,iis-6,wmi,application-pool,Winapi,Powershell,Iis 6,Wmi,Application Pool,最近的一次windows更新似乎破坏了我用来回收IIS6应用程序池的一些功能,因为这个功能到今天为止已经运行了几个月 Exception calling "Recycle" : "Win32: The object identifier does not representException calling "Recycle" : "Win32: The object identifier does not represent a valid object. 我用来回收应用程序池的函数是: f

最近的一次windows更新似乎破坏了我用来回收IIS6应用程序池的一些功能,因为这个功能到今天为止已经运行了几个月

Exception calling "Recycle" : "Win32: The object identifier does not representException calling "Recycle" : "Win32: The object identifier does not represent a valid object.
我用来回收应用程序池的函数是:

function recycle-pool($strServerName)
{
    $objWMI = [WmiSearcher] "Select * From IIsApplicationPool"
    $objWMI.Scope.Path = "\\" + $strServerName + "\root\microsoftiisv2"
    $objWMI.Scope.Options.Authentication = 6
    $pools = $objWMI.Get()
    foreach ($pool in $pools)
    {
        $pool.recycle()
        if (!$?)
        {
            Write-Host $pool.name " - ERROR"
        }
        else
        {
            Write-Host $pool.name " - Recycled"
        }
}

你知道问题出在哪里吗?我应该如何解决这个问题?

你可以尝试使用ADSI进行回收:

$server = "IIsServerName"  
$iis = [adsi]"IIS://$server/W3SVC/AppPools"  
$iis.psbase.children | foreach {  
    $pool = [adsi]($_.psbase.path)   
    $pool.psbase.invoke("recycle")  
}

其中一个应用程序池已停止,这导致了错误。其他应用程序池的回收情况良好。上面的代码可以用于其他任何人。

最初的问题是针对IIS6的,但我在Windows 2012上使用WebAdministration模块的重新启动WebAppPool时遇到了类似的问题。于是我又打电话给AppCMD,效果很好:

& $env:windir\system32\inetsrv\appcmd recycle apppool "YOURAPPPOOLNAMEHERE"

有时候,你不必过度设计解决方案。希望这有助于其他人。

看起来$pool对象可能为空,因此我选择应用程序池对象的方式一定有问题。使用此方法时,抛出了一个错误:使用“2”参数调用“Invoke”时发生异常:“异常已由调用的目标引发。”在D:\scripts\deployment\inc\deploy.ps1:124 char:28+$pool.psbase.invoke(感谢Bewc,我没有意识到这是可能的。要简单得多。