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

在C#/Powershell中-是否可以更改IIS应用程序池的空闲超时?,c#,iis,powershell,C#,Iis,Powershell,我想禁用应用程序池的空闲超时(将其设置为零),并且我想在设置时执行此操作,是否可以从C#或PowerShell执行此操作?我使用以下函数来获取应用程序池对象: %windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.processModel.idleTimeout:00:00:00 $query = "Select * From IIsApplicatio

我想禁用应用程序池的空闲超时(将其设置为零),并且我想在设置时执行此操作,是否可以从C#或PowerShell执行此操作?

我使用以下函数来获取应用程序池对象:

%windir%\system32\inetsrv\appcmd set config -section:applicationPools
   -applicationPoolDefaults.processModel.idleTimeout:00:00:00
$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 + ")")
    }
}
根据一段不相关的代码,我将一个站点放置在一个新的应用程序池中。这只是一个如何使用SETWMIIINSTANCE的示例

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修改它们

这是我决定使用的脚本:

$myApplicationPool = Get-WmiObject -Class IISApplicationPoolSetting -Namespace "root\microsoftiisv2" | Where-Object {$_.Name -eq 'W3SVC/APPPOOLS/DefaultAppPool'}
$myApplicationPool.IdleTimeout=0
$myApplicationPool.Put()
如果其他人对此有更好的方法,请让我知道

希望这能帮助别人


问候。

如果您使用的是PowerShell 2或更高版本,您应该可以访问。您还需要加载模块

然后您可以执行(示例取自)

并验证该值是否已使用更改

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

使用powershell时,请使用以下命令:

$appPoolName = "xxxAppPool"
&"$env:windir\system32\inetsrv\appcmd" set APPPOOL $appPoolName /processModel.idleTimeout:0.00:00:00
@R0MANARMY的(目前最流行的)不适合我。它运行正常,但随后的检查显示空闲超时没有改变

根据,该答案修改对象的内存中副本。我将中的示例代码修改为:

Get ChildItem IIS:\AppPools\$name | ForEach{$\进程模型.IdleTimeout=[TimeSpan]::frommins(0);$\设置项;}

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

设置应用程序池空闲超时

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

下面是一个完整的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
}

或者,您也可以在代码中使用
ServerManager类
。谢谢您的回答,我将尝试一下。我正在为您提供的两种解决方案快速进行概念验证,但是,它们似乎不适用于Windows Server 2003,因为ServerManager适用于iis 7,appcmd仅适用于更新版本的IISNote。注意,此方法仅适用于安装了iis 6 WMI兼容功能的情况。请注意,此方法仅适用于安装了iis 6 WMI兼容功能的情况。此答案不适用于我我添加了一个适合我的版本:非常适合我,但您需要确保“WebAdministration”已安装并加载,我发现它对我的工作非常有用。它对我的工作方式如下:$ts=New TimeSpan-Seconds 0 Set ItemProperty(“IIS:\AppPools\$name”)-name processModel.idleTimeout-Value$tsA一行程序有效。但别忘了从导入模块WebAdministration开始。-Name idleTimeout给了我一个错误(在上找不到Propert idleTimeout)。正确的名称是processModel.idleTimeout。
$appPoolName = 'MyAppPoolName'
$appPoolPath = '/system.applicationHost/applicationPools/Add[@name="' + $appPoolName + '"]/processModel'
Set-WebConfigurationProperty $appPoolPath -Name idleTimeout -value ([TimeSpan]::FromMinutes(0)) -PSPATH iis:
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
}