Winapi 使用PowerShell回收IIS应用程序池;调用“回收”时出现异常;
最近的一次windows更新似乎破坏了我用来回收IIS6应用程序池的一些功能,因为这个功能到今天为止已经运行了几个月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
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,我没有意识到这是可能的。要简单得多。