在C#/ Powershell中,是否可以更改IIS应用程序池的空闲超时时间?

20
我想禁用一个应用程序池的空闲超时(将其设置为零),并在安装时执行此操作,是否可以通过C#或PowerShell执行此操作?
8个回答

27
如果您正在使用PowerShell 2或更高版本,则应该可以访问Set-ItemProperty。您还需要加载WebAdministration模块。
然后,您可以执行以下操作(示例摘自here
Set-ItemProperty ("IIS:\AppPools\$name") -Name processModel.idleTimeout -value ( [TimeSpan]::FromMinutes(0))

并验证值是否已更改

Get-ItemProperty ("IIS:\AppPools\$name") -Name processModel.idleTimeout.value

1
这个答案对我没用。我已经添加了一个对我有用的版本:https://dev59.com/7W025IYBdhLWcg3wwo2m#41111237 - Tony S Yu
这对我非常有效,但您需要确保已安装并加载了“WebAdministration”。我发现这个答案在使其正常工作方面非常有用。 - David Rogers
它对我起作用的方式如下:$ts = New-TimeSpan -Seconds 0 Set-ItemProperty ("IIS:\AppPools$name") -Name processModel.idleTimeout -Value $ts - katrash

7

@R0MANARMY的答案(目前最受欢迎的)对我没用。它可以正常运行,但随后的检查显示空闲超时未改变。

根据这篇博客文章,该答案修改了对象的内存副本。我修改了R0MANARMY的答案中的示例代码:

Get-ChildItem IIS:\AppPools\$name | ForEach { $_.processModel.IdleTimeout = [TimeSpan]::FromMinutes(0); $_ | Set-Item; }

一行代码就能搞定。不过别忘了要以“Import-Module WebAdministration”开始。 - CodingBarfield

4
%windir%\system32\inetsrv\appcmd set config -section:applicationPools
   -applicationPoolDefaults.processModel.idleTimeout:00:00:00

或者你可以在代码中使用ServerManager类 http://msdn.microsoft.com/en-us/library/microsoft.web.administration.servermanager.aspx - Kris Ivanov
我正在为您提供的两种解决方案进行快速概念验证,但它们似乎在Window Server 2003上无法工作,因为ServerManager仅适用于iis 7,而appcmd仅存在于更高版本的IIS上。 - Bongo Sharp

1
我使用以下函数通用地获取应用程序池对象:
$query = "Select * From IIsApplicationPoolSetting WHERE WAMUserName LIKE '%$uServer'"
$query
$pools = Get-WmiObject -Authentication 6 -ComputerName $server -Query $query -Namespace 'root/microsoftiisv2' 
if ($pools)
{
    foreach ($pool in $pools)
    {
        Write-Host("    WAM Pool: " + $pool.Name + ", " + $pool.WAMUserName + " (" + $pool.WAMUserPass + ")")
    }
}

以下是与编程无关的代码片段,这里演示了如何将网站放置在新的应用程序池中。这只是一个使用Set-WMIInstance的示例。

if ($site.AppPoolID -ne $poolID)
{
    # Write-Host("Updating $($site.Name) from $($site.AppPoolID) to $($poolID)")
    $wmiArgs = @{"AppPoolID"=$poolID}

    [void](Set-WMIInstance -InputObject $site -Arguments $wmiArgs)
} else {
    # Write-Host("No update needed")
}

使用 Get-Member 命令来了解 $pool 对象有哪些属性,然后使用 Set-WMIInstance 命令来修改它们。

请注意,此方法仅适用于安装了IIS 6 WMI兼容性功能的情况。 - Warren Rumak

1

以下是完整的 Powershell 示例,展示如何创建一个应用程序池(用于 ASP.NET Core)并设置许多其值:

Import-Module WebAdministration

$appPoolName     = "MyWebPool"
$appPoolFullName = "IIS:\AppPools\$appPoolName"

if(!(Test-Path $appPoolFullName)) {
    New-WebAppPool $appPoolName -Force

    Set-ItemProperty $appPoolFullName -Name managedPipelineMode -Value Integrated
    Set-ItemProperty $appPoolFullName -Name managedRuntimeVersion -Value "" # means "No Managed Code"
    Set-ItemProperty $appPoolFullName -Name startMode -Value AlwaysRunning

    $3_days = New-TimeSpan -Days 3
    Set-ItemProperty $appPoolFullName -Name processModel.idleTimeout -Value $3_days
    Set-ItemProperty $appPoolFullName -Name processModel.identityType -Value NetworkService
    Set-ItemProperty $appPoolFullName -Name processModel.idleTimeoutAction -Value Suspend

    $zero_ts = New-TimeSpan
    Set-ItemProperty $appPoolFullName -Name recycling.periodicRestart.time -Value $zero_ts
}

1

在使用PowerShell时,请使用以下命令:

$appPoolName = "xxxAppPool"
&"$env:windir\system32\inetsrv\appcmd" set APPPOOL $appPoolName /processModel.idleTimeout:0.00:00:00

0

这是我决定使用的脚本:

$myApplicationPool = Get-WmiObject -Class IISApplicationPoolSetting -Namespace "root\microsoftiisv2" | Where-Object {$_.Name -eq 'W3SVC/APPPOOLS/DefaultAppPool'}
$myApplicationPool.IdleTimeout=0
$myApplicationPool.Put()

如果有其他更好的方法,请告诉我。
希望这能帮助到某些人。
谢谢。

请注意,此方法仅适用于安装了IIS 6 WMI兼容性功能的计算机。 - Warren Rumak

0

获取应用程序池配置(供参考)

$appPoolName = 'MyAppPoolName'
$appPoolPath = '/system.applicationHost/applicationPools/Add[@name="' + $appPoolName + '"]//.'
Get-WebConfiguration $appPoolPath -PSPATH iis:

设置应用程序池空闲超时时间

$appPoolName = 'MyAppPoolName'
$appPoolPath = '/system.applicationHost/applicationPools/Add[@name="' + $appPoolName + '"]/processModel'
Set-WebConfigurationProperty $appPoolPath -Name idleTimeout -value ([TimeSpan]::FromMinutes(0)) -PSPATH iis:

名称idleTimeout给我一个错误(<APP POOL NAME>上未找到属性idleTimeout)。正确的名称是processModel.idleTimeout。 - Kappacake

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接