大家好,今天我们来聊一个运维和开发同学经常会遇到的“甜蜜的烦恼”——服务器迁移。特别是当我们面对一台配置了多个网站、应用池和 SSL 证书的 IIS 服务器时,手动记录和在新服务器上重新配置,不仅耗时耗力,还极易出错。
想象一下,因为遗漏了一个关键的绑定或环境变量,导致网站在新服务器上无法启动,那种在深夜排查问题的感觉,相信谁也不想体验。
幸运的是,Windows Server 提供了强大的自动化工具——PowerShell。通过它,我们可以将繁琐的配置导出工作变成一个可以一键执行的脚本。这篇文章将带大家一步步构建一个实用的 PowerShell 脚本,用于自动化收集和打包 IIS 的核心配置。
为什么选择自动化?
在深入脚本之前,我们先明确一下为什么自动化是最佳选择:
- 准确性:脚本会忠实地执行每一个命令,彻底避免因手动操作导致的人为错误。
- 效率:只需运行一个脚本,几分钟内就能完成过去可能需要数小时的手动工作。
- 可重复性:无论是迁移测试环境还是生产环境,脚本都能提供一致的输出,保证了迁移过程的标准化。
- 配置即文档:导出的配置文件本身就是一份完美的服务器配置文档,便于审计和未来查阅。
准备工作
在运行脚本之前,请确保满足以下条件:
这将在当前会话中允许运行未签名的本地脚本。
核心脚本解析
我们的目标是创建一个脚本,它能做到:
下面就是我们精心设计的 PowerShell 脚本。
<#
.SYNOPSIS
Automates the export of IIS configurations and associated SSL certificates.
.DESCRIPTION
This 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.
.NOTES
Author: Your Tech Blogger
Version: 1.0
Run 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 Red
exit
}
# — 3. 导出网站和应用池列表 (用于文档和审查) —
# 导入 WebAdministration 模块
Import-Module WebAdministration
Write-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 Green
Write-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\\My
if ($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 $securePassword
Write-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 –Force
if ($?) {
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"
如何使用脚本
```4. **获取结果**:脚本执行完毕后,我们会在 C 盘根目录下找到一个名为 `IIS_Export_YYYYMMDD_HHMM.zip` 的压缩包。这个包里包含了我们迁移所需的所有配置信息。
迁移到新服务器:恢复配置的要点
有了导出的配置包,在新服务器上恢复就变得简单多了,但仍需注意以下几点:
cd $env:windir\\system32\\inetsrv\\
# 恢复配置前,强烈建议先备份新服务器的当前配置!
.\\appcmd.exe add backup "Before-Migration-Restore"
# 从我们的导出文件中恢复配置
.\\appcmd.exe restore config -in:"C:\\Path\\To\\Your\\applicationHost.config.xml"
总结
自动化是现代 IT 运维的基石。通过 PowerShell,我们可以将复杂、易错的 IIS 迁移任务转变为一个简单、可靠的自动化流程。今天分享的这个脚本是一个很好的起点,我们可以根据自己的特定需求进行修改和扩展,比如增加对特定应用程序配置文件(web.config)或注册表项的备份。
希望这篇文章能帮助大家下次面对服务器迁移时,能够更加从容和自信。
评论前必须登录!
注册