告别手动迁移:使用 PowerShell 一键导出 IIS 配置,让服务器迁移更轻松
大家好,今天我们来聊一个运维和开发同学经常会遇到的“甜蜜的烦恼”——服务器迁移。特别是当我们面对一台配置了多个网站、应用池和 SSL 证书的 IIS 服务器时,手动记录和在新服务器上重新配置,不仅耗时耗力,还极易出错。
想象一下,因为遗漏了一个关键的绑定或环境变量,导致网站在新服务器上无法启动,那种在深夜排查问题的感觉,相信谁也不想体验。
幸运的是,Windows Server 提供了强大的自动化工具——PowerShell。通过它,我们可以将繁琐的配置导出工作变成一个可以一键执行的脚本。这篇文章将带大家一步步构建一个实用的 PowerShell 脚本,用于自动化收集和打包 IIS 的核心配置。
为什么选择自动化?
在深入脚本之前,我们先明确一下为什么自动化是最佳选择:
- 准确性:脚本会忠实地执行每一个命令,彻底避免因手动操作导致的人为错误。
- 效率:只需运行一个脚本,几分钟内就能完成过去可能需要数小时的手动工作。
- 可重复性:无论是迁移测试环境还是生产环境,脚本都能提供一致的输出,保证了迁移过程的标准化。
- 配置即文档:导出的配置文件本身就是一份完美的服务器配置文档,便于审计和未来查阅。
准备工作
在运行脚本之前,请确保满足以下条件:
- 管理员权限:需要以管理员身份运行 PowerShell,因为访问 IIS 配置和导出证书需要提升的权限。
- PowerShell 执行策略:为了能够运行本地脚本,可能需要调整执行策略。可以在管理员 PowerShell 窗口中运行以下命令:
这将在当前会话中允许运行未签名的本地脚本。Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process
- WebAdministration 模块:如果服务器上安装了 IIS,那么
WebAdministration
模块通常已经可用。脚本将利用此模块来与 IIS 进行交互。
核心脚本解析
我们的目标是创建一个脚本,它能做到:
- 导出完整的 IIS 配置(站点、应用池、绑定等)。
- 导出所有与网站绑定的 SSL 证书(这是最容易被遗忘的部分!)。
- 将所有导出的文件打包成一个独立的 .zip 文件,方便传输。
下面就是我们精心设计的 PowerShell 脚本。
<#
.SYNOPSISAutomates the export of IIS configurations and associated SSL certificates..DESCRIPTIONThis script performs a comprehensive backup of an IIS server's configuration. It exports:1. The entire applicationHost.config using appcmd.2. A list of all websites and application pools to CSV files for easy review.3. All SSL certificates found in the local machine's personal store, secured with a password.Finally, it compresses all exported files into a single ZIP archive for easy migration..NOTESAuthor: Your Tech BloggerVersion: 1.0Run this script with Administrator privileges.
#># --- 1. 初始化变量和环境 ---# 设置导出文件的根目录
$exportBasePath = "C:\IIS_Export_$(Get-Date -Format 'yyyyMMdd_HHmm')"
# 设置导出证书时使用的密码。请务必修改为一个强密码!
$certificatePassword = "YourStrongPasswordHere!" # 检查并创建导出目录
if (-not (Test-Path -Path $exportBasePath)) {Write-Host "创建导出目录: $exportBasePath"New-Item -Path $exportBasePath -ItemType Directory | Out-Null
} else {Write-Host "导出目录已存在,将使用: $exportBasePath"
}Write-Host "--------------------------------------------------------"
Write-Host "开始导出 IIS 配置..."
Write-Host "导出目录: $exportBasePath"
Write-Host "--------------------------------------------------------"# --- 2. 导出完整的 IIS 配置 ---# 使用 appcmd.exe,这是导出和恢复 IIS 配置最可靠的工具
Write-Host "正在导出 applicationHost.config..."
& $env:windir\system32\inetsrv\appcmd.exe list config -xml > "$exportBasePath\applicationHost.config.xml"
if ($?) {Write-Host "✅ 成功: 完整的 IIS 配置已导出。" -ForegroundColor Green
} else {Write-Host "❌ 失败: 导出 IIS 配置时出错。" -ForegroundColor Redexit
}# --- 3. 导出网站和应用池列表 (用于文档和审查) ---# 导入 WebAdministration 模块
Import-Module WebAdministrationWrite-Host "正在导出网站列表..."
Get-Website | Select-Object Name, Id, State, PhysicalPath, @{n='Bindings';e={$_.bindings.collection | % {"$($_.protocol)://$($_.bindinginformation)"} | Out-String}} | Export-Csv -Path "$exportBasePath\Websites_List.csv" -NoTypeInformation -Encoding UTF8
Write-Host "✅ 成功: 网站列表已导出到 Websites_List.csv。" -ForegroundColor GreenWrite-Host "正在导出应用池列表..."
Get-WebAppPool | Select-Object Name, State, ManagedRuntimeVersion, ManagedPipelineMode, @{n='Identity';e={$_.processmodel.identitytype}}, @{n='Username';e={$_.processmodel.username}} |Export-Csv -Path "$exportBasePath\AppPools_List.csv" -NoTypeInformation -Encoding UTF8
Write-Host "✅ 成功: 应用池列表已导出到 AppPools_List.csv。" -ForegroundColor Green# --- 4. 导出 SSL 证书 ---Write-Host "正在导出 SSL 证书..."
# 将密码转换为安全字符串,这是 Export-PfxCertificate 的要求
$securePassword = ConvertTo-SecureString -String $certificatePassword -AsPlainText -Force# 获取个人证书存储区 (My/Personal) 中的所有证书
$certs = Get-ChildItem -Path Cert:\LocalMachine\Myif ($certs.Count -eq 0) {Write-Host "⚠️ 警告: 在本地计算机的个人存储中未找到任何证书。" -ForegroundColor Yellow
} else {foreach ($cert in $certs) {# 只导出包含私钥的证书,因为这些是用于 HTTPS 绑定的证书if ($cert.HasPrivateKey) {$exportPath = Join-Path -Path $exportBasePath -ChildPath "$($cert.Thumbprint).pfx"try {Export-PfxCertificate -Cert $cert -FilePath $exportPath -Password $securePasswordWrite-Host "✅ 成功: 已导出证书 $($cert.Subject) (指纹: $($cert.Thumbprint))" -ForegroundColor Green} catch {Write-Host "❌ 失败: 导出证书 $($cert.Subject) 时出错。错误信息: $($_.Exception.Message)" -ForegroundColor Red}}}
}# --- 5. 打包所有文件 ---$zipFilePath = "C:\IIS_Export_$(Get-Date -Format 'yyyyMMdd_HHmm').zip"
Write-Host "--------------------------------------------------------"
Write-Host "正在将所有导出的文件压缩到: $zipFilePath"Compress-Archive -Path "$exportBasePath\*" -DestinationPath $zipFilePath -Forceif ($?) {Write-Host "✅ 成功: 所有文件已成功打包!" -ForegroundColor Green# (可选) 清理临时导出文件夹# Remove-Item -Path $exportBasePath -Recurse -Force# Write-Host "已清理临时文件夹: $exportBasePath"
} else {Write-Host "❌ 失败: 创建 ZIP 压缩包时出错。" -ForegroundColor Red
}Write-Host "--------------------------------------------------------"
Write-Host "🎉 IIS 配置导出完成!🎉"
Write-Host "迁移包已保存到: $zipFilePath"
如何使用脚本
- 保存脚本:将上面的代码复制并保存到一个文件中,例如
Export-IIS-Config.ps1
。 - 修改密码:打开脚本文件,将
$certificatePassword
变量的值修改为一个我们自己设定的、足够强度的密码。请务必记住这个密码,因为在新服务器上导入证书时需要用到它。 - 运行脚本:以管理员身份打开 PowerShell,导航到脚本所在的目录,然后运行它:
.\Export-IIS-Config.ps1 ```4. **获取结果**:脚本执行完毕后,我们会在 C 盘根目录下找到一个名为 `IIS_Export_YYYYMMDD_HHMM.zip` 的压缩包。这个包里包含了我们迁移所需的所有配置信息。
迁移到新服务器:恢复配置的要点
有了导出的配置包,在新服务器上恢复就变得简单多了,但仍需注意以下几点:
- 安装 IIS 角色:确保新服务器上已经安装了与旧服务器相同或更高版本的 IIS,并且包含了所有必需的角色服务(如 ASP.NET、WebSocket 等)。
- 导入证书:将 .pfx 文件拷贝到新服务器,然后通过 IIS 管理器或证书管理控制台(
certlm.msc
),使用我们之前设置的密码,将它们逐一导入到“本地计算机 -> 个人 -> 证书”存储区。 - 恢复配置:将
applicationHost.config.xml
文件拷贝到新服务器。使用appcmd
命令来恢复配置。注意: 直接覆盖applicationHost.config
文件有风险,推荐使用appcmd
的增量恢复功能。# 切换到 inetsrv 目录 cd $env:windir\system32\inetsrv\# 恢复配置前,强烈建议先备份新服务器的当前配置! .\appcmd.exe add backup "Before-Migration-Restore"# 从我们的导出文件中恢复配置 .\appcmd.exe restore config -in:"C:\Path\To\Your\applicationHost.config.xml"
- 检查物理路径:
appcmd
不会帮我们迁移网站的物理文件(.dll、.html、图片等)。我们需要手动将网站文件拷贝到新服务器,并确保applicationHost.config
中指定的physicalPath
与实际路径一致。如果不一致,需要手动修改或通过 IIS 管理器重新指定。
总结
自动化是现代 IT 运维的基石。通过 PowerShell,我们可以将复杂、易错的 IIS 迁移任务转变为一个简单、可靠的自动化流程。今天分享的这个脚本是一个很好的起点,我们可以根据自己的特定需求进行修改和扩展,比如增加对特定应用程序配置文件(web.config
)或注册表项的备份。
希望这篇文章能帮助大家下次面对服务器迁移时,能够更加从容和自信。