大家好,今天我们来聊一个运维和开发同学经常会遇到的"甜蜜的烦恼"------服务器迁移。特别是当我们面对一台配置了多个网站、应用池和 SSL 证书的 IIS 服务器时,手动记录和在新服务器上重新配置,不仅耗时耗力,还极易出错。
想象一下,因为遗漏了一个关键的绑定或环境变量,导致网站在新服务器上无法启动,那种在深夜排查问题的感觉,相信谁也不想体验。
幸运的是,Windows Server 提供了强大的自动化工具------PowerShell。通过它,我们可以将繁琐的配置导出工作变成一个可以一键执行的脚本。这篇文章将带大家一步步构建一个实用的 PowerShell 脚本,用于自动化收集和打包 IIS 的核心配置。
为什么选择自动化?
在深入脚本之前,我们先明确一下为什么自动化是最佳选择:
- 准确性:脚本会忠实地执行每一个命令,彻底避免因手动操作导致的人为错误。
- 效率:只需运行一个脚本,几分钟内就能完成过去可能需要数小时的手动工作。
- 可重复性:无论是迁移测试环境还是生产环境,脚本都能提供一致的输出,保证了迁移过程的标准化。
- 配置即文档:导出的配置文件本身就是一份完美的服务器配置文档,便于审计和未来查阅。
准备工作
在运行脚本之前,请确保满足以下条件:
-
管理员权限:需要以管理员身份运行 PowerShell,因为访问 IIS 配置和导出证书需要提升的权限。
-
PowerShell 执行策略 :为了能够运行本地脚本,可能需要调整执行策略。可以在管理员 PowerShell 窗口中运行以下命令:
powershellSet-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process
这将在当前会话中允许运行未签名的本地脚本。
-
WebAdministration 模块 :如果服务器上安装了 IIS,那么
WebAdministration
模块通常已经可用。脚本将利用此模块来与 IIS 进行交互。
核心脚本解析
我们的目标是创建一个脚本,它能做到:
- 导出完整的 IIS 配置(站点、应用池、绑定等)。
- 导出所有与网站绑定的 SSL 证书(这是最容易被遗忘的部分!)。
- 将所有导出的文件打包成一个独立的 .zip 文件,方便传输。
下面就是我们精心设计的 PowerShell 脚本。
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"
如何使用脚本
-
保存脚本 :将上面的代码复制并保存到一个文件中,例如
Export-IIS-Config.ps1
。 -
修改密码 :打开脚本文件,将
$certificatePassword
变量的值修改为一个我们自己设定的、足够强度的密码。请务必记住这个密码,因为在新服务器上导入证书时需要用到它。 -
运行脚本 :以管理员身份 打开 PowerShell,导航到脚本所在的目录,然后运行它:
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
的增量恢复功能。powershell# 切换到 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
)或注册表项的备份。
希望这篇文章能帮助大家下次面对服务器迁移时,能够更加从容和自信。