【问题标题】:How to rename application pool that already has application assigned to it?如何重命名已经分配了应用程序的应用程序池?
【发布时间】:2013-11-09 08:23:57
【问题描述】:

我有一个应用程序池,其中分配了很多应用程序,它不允许我重命名。

除了删除和创建新的应用程序池之外,还有什么方法可以为我的应用程序池取一个新名称吗?我不想去重新分配其中的每个应用程序。

【问题讨论】:

    标签: iis application-pool


    【解决方案1】:

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

    IIS 不支持其他选项

    【讨论】:

    • 我刚刚完成了这项工作。这还不错,而且很有效。
    【解决方案2】:

    这是我能解决的最简单的方法,虽然我不敢相信这不是更容易。

    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
    

    【讨论】:

    • 谢谢!我调整了您的脚本并成功批量重命名了一些应用程序池。
    • 这很酷——你不会有动态应用程序的权限问题吗?
    【解决方案3】:

    不,没有。

    要么忍受这个名字,要么创建一个新的应用程序池并一个一个地分配应用程序。

    如果您需要在多个服务器上重复它,您甚至可以使用 ADSI 和 JavaScript 或 VBScript 自动执行它:

    【讨论】:

      【解决方案4】:

      我创建了类似的脚本来自动化这项工作。 这与这里的其他答案有点不同:

      • 除了 WebApplications 之外,它还适用于网站;
      • 它适用于所有池:有和没有分配的应用程序;

      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"
      

      【讨论】:

        【解决方案5】:

        是的,有一个选项。创建一个虚拟应用程序池或使用 DefaultApppool。将现有站点与 defaultapppool 相关联。现在转到原始应用程序池,停止应用程序池并重命名。

        将 url 关联回重命名的 appool。

        【讨论】:

          猜你喜欢
          • 2013-03-24
          • 1970-01-01
          • 2021-10-14
          • 2017-09-05
          • 2016-05-04
          • 1970-01-01
          • 2019-10-26
          • 1970-01-01
          • 2017-07-08
          相关资源
          最近更新 更多