如何为已分配应用程序的应用程序池重命名?

17

我有一个应用程序池,它有很多被分配给它的应用程序,它不会让我重命名。

除了删除并创建一个新的应用程序池外,是否有其他方法可以为我的应用程序池获取一个新名称?我不想去重新分配其中的每个应用程序。

5个回答

25

将应用程序分配给另一个池,重命名您想要重命名的池。然后将应用程序重新分配回您的池中。

IIS不支持其他选项。


我刚刚完成了这个任务。它还不错,而且它可以工作。 - Christiaan Westerbeek

5
这是我能想到的最简单的方法,虽然我不敢相信这不应该更容易一些。
Import-Module WebAdministration

$oldName = "OldAppPool";
$newName = "NewAppPool";

if(-not (Test-Path IIS:\AppPools\TempPool)){
    New-WebAppPool TempPool
}
$tempAppPool = Get-Item IIS:\AppPools\TempPool

foreach($site in Get-ChildItem IIS:\Sites){
    $apps = $site | Get-ChildItem | Where-Object { $_.ApplicationPool -eq $oldName }

    foreach($app in $apps){
        $path = ("IIS:\Sites\{0}\{1}" -f $site.name, $app.name)
        $path
        Set-ItemProperty $path applicationPool TempPool
    }
}

Set-ItemProperty "IIS:\AppPools\$oldName" -Name name -Value $newName

foreach($site in Get-ChildItem IIS:\Sites){
    $apps = $site | Get-ChildItem | Where-Object { $_.ApplicationPool -eq "TempPool" }

    foreach($app in $apps){
        $path = ("IIS:\Sites\{0}\{1}" -f $site.name, $app.name)
        $path
        Set-ItemProperty $path applicationPool $newName
    }
}

Remove-WebAppPool TempPool

1
谢谢!我调整了你的脚本,成功地批量重命名了一些应用程序池。 - Sam
这很酷 - 不过动态应用程序会有权限问题,你觉得呢? - Frank

3

我创建了类似的脚本来自动化这个工作。与此处其他答案略有不同:

  • 它适用于网站和Web应用程序;
  • 它适用于所有池:有和没有分配应用程序的池;

Powershell脚本:

Import-Module WebAdministration

Function Rename-AppPool([String]$oldName="", [String]$newName="") {
    if ($oldName -eq "") {
        Write-Warning "Parameter 'oldName' was not provided."
        return
    }

    if ($newName -eq "") {
        Write-Warning "Parameter 'newName' was not provided."
        return
    }

    if(-not (Test-Path "IIS:\AppPools\$oldName")){
        Write-Warning "There is no pool with name '$oldName' to rename. Operation stopped."
        return
    }

    if(Test-Path "IIS:\AppPools\$newName"){
        Write-Warning "Pool with name '$newName' already exists. Operation stopped."
        return
    }

    Write-Output "Renaming app pool '$oldName' to '$newName'"

    $pathsOfPools = New-Object System.Collections.ArrayList

    $listOfSites = Get-ChildItem "IIS:\Sites"

    foreach ($site in $listOfSites) {
        if ($site.applicationPool -eq $oldName) {
            $path = ("IIS:\Sites\{0}" -f $site.name)
            $pathsOfPools.Add($path) | Out-Null
        }

        $apps = $site | Get-ChildItem
        foreach ($app in $apps) {
            if ($app.applicationPool -eq $oldName) {                
                $path = ("IIS:\Sites\{0}\{1}" -f $site.name, $app.name)
                $pathsOfPools.Add($path) | Out-Null
            }
        }
    }

    $tempGuid = [Guid]::NewGuid()
    $tempName = $tempGuid.Guid

    if ($pathsOfPools.Count -gt 0) {

        $pathsOfPools   

        New-WebAppPool $tempName | Out-Null
        Write-Output "Temp app pool '$tempName' has been created"

        Write-Output "Changing apps to Temp pool"
        foreach ($path in $pathsOfPools) {
            Set-ItemProperty $path applicationPool $tempName        
        }
    }

    Set-ItemProperty "IIS:\AppPools\$oldName" -Name name -Value $newName
    Write-Output "Application pool name has been changed"

    if ($pathsOfPools.Count -gt 0) {
        Write-Output "Changing apps to New pool"
        foreach ($path in $pathsOfPools) {
            Set-ItemProperty $path applicationPool $newName     
        }   

        Remove-WebAppPool $tempName 
        Write-Output "Temp pool has been removed"
    }
}

Rename-AppPool "OldName" "NewBetterName"

这个脚本对我来说比这里的另一个更好用。 - deadflowers

3
没有,不存在这样的功能。要么忍受这个名字,要么逐个创建新的应用程序池并分配应用程序。
如果需要在多个服务器上重复此操作,甚至可以使用ADSI和JavaScript或VBScript自动化执行此操作。

1
是的,有一个选项。创建一个虚拟应用程序池或者使用默认应用程序池。将现有的网站关联到默认应用程序池。然后转到原始应用程序池,停止应用程序池并重命名。
将URL重新关联到重命名的应用程序池。

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