当前位置: 首页 > news >正文

告别手动迁移:使用 PowerShell 一键导出 IIS 配置,让服务器迁移更轻松

大家好,今天我们来聊一个运维和开发同学经常会遇到的“甜蜜的烦恼”——服务器迁移。特别是当我们面对一台配置了多个网站、应用池和 SSL 证书的 IIS 服务器时,手动记录和在新服务器上重新配置,不仅耗时耗力,还极易出错。

想象一下,因为遗漏了一个关键的绑定或环境变量,导致网站在新服务器上无法启动,那种在深夜排查问题的感觉,相信谁也不想体验。

幸运的是,Windows Server 提供了强大的自动化工具——PowerShell。通过它,我们可以将繁琐的配置导出工作变成一个可以一键执行的脚本。这篇文章将带大家一步步构建一个实用的 PowerShell 脚本,用于自动化收集和打包 IIS 的核心配置。
在这里插入图片描述

为什么选择自动化?

在深入脚本之前,我们先明确一下为什么自动化是最佳选择:

  • 准确性:脚本会忠实地执行每一个命令,彻底避免因手动操作导致的人为错误。
  • 效率:只需运行一个脚本,几分钟内就能完成过去可能需要数小时的手动工作。
  • 可重复性:无论是迁移测试环境还是生产环境,脚本都能提供一致的输出,保证了迁移过程的标准化。
  • 配置即文档:导出的配置文件本身就是一份完美的服务器配置文档,便于审计和未来查阅。
准备工作

在运行脚本之前,请确保满足以下条件:

  1. 管理员权限:需要以管理员身份运行 PowerShell,因为访问 IIS 配置和导出证书需要提升的权限。
  2. PowerShell 执行策略:为了能够运行本地脚本,可能需要调整执行策略。可以在管理员 PowerShell 窗口中运行以下命令:
    Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process
    
    这将在当前会话中允许运行未签名的本地脚本。
  3. WebAdministration 模块:如果服务器上安装了 IIS,那么 WebAdministration 模块通常已经可用。脚本将利用此模块来与 IIS 进行交互。
核心脚本解析

我们的目标是创建一个脚本,它能做到:

  1. 导出完整的 IIS 配置(站点、应用池、绑定等)。
  2. 导出所有与网站绑定的 SSL 证书(这是最容易被遗忘的部分!)。
  3. 将所有导出的文件打包成一个独立的 .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"
如何使用脚本
  1. 保存脚本:将上面的代码复制并保存到一个文件中,例如 Export-IIS-Config.ps1
  2. 修改密码:打开脚本文件,将 $certificatePassword 变量的值修改为一个我们自己设定的、足够强度的密码。请务必记住这个密码,因为在新服务器上导入证书时需要用到它。
  3. 运行脚本:以管理员身份打开 PowerShell,导航到脚本所在的目录,然后运行它:
    .\Export-IIS-Config.ps1
    ```4.  **获取结果**:脚本执行完毕后,我们会在 C 盘根目录下找到一个名为 `IIS_Export_YYYYMMDD_HHMM.zip` 的压缩包。这个包里包含了我们迁移所需的所有配置信息。
迁移到新服务器:恢复配置的要点

有了导出的配置包,在新服务器上恢复就变得简单多了,但仍需注意以下几点:

  1. 安装 IIS 角色:确保新服务器上已经安装了与旧服务器相同或更高版本的 IIS,并且包含了所有必需的角色服务(如 ASP.NET、WebSocket 等)。
  2. 导入证书:将 .pfx 文件拷贝到新服务器,然后通过 IIS 管理器或证书管理控制台(certlm.msc),使用我们之前设置的密码,将它们逐一导入到“本地计算机 -> 个人 -> 证书”存储区。
  3. 恢复配置:将 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"
    
  4. 检查物理路径appcmd 不会帮我们迁移网站的物理文件(.dll、.html、图片等)。我们需要手动将网站文件拷贝到新服务器,并确保 applicationHost.config 中指定的 physicalPath 与实际路径一致。如果不一致,需要手动修改或通过 IIS 管理器重新指定。
总结

自动化是现代 IT 运维的基石。通过 PowerShell,我们可以将复杂、易错的 IIS 迁移任务转变为一个简单、可靠的自动化流程。今天分享的这个脚本是一个很好的起点,我们可以根据自己的特定需求进行修改和扩展,比如增加对特定应用程序配置文件(web.config)或注册表项的备份。

希望这篇文章能帮助大家下次面对服务器迁移时,能够更加从容和自信。


文章转载自:
http://banquet.hyyxsc.cn
http://chromatograph.hyyxsc.cn
http://bullfrog.hyyxsc.cn
http://caressing.hyyxsc.cn
http://anthropology.hyyxsc.cn
http://aleyard.hyyxsc.cn
http://baltic.hyyxsc.cn
http://beardless.hyyxsc.cn
http://baneful.hyyxsc.cn
http://bund.hyyxsc.cn
http://chiastic.hyyxsc.cn
http://accidented.hyyxsc.cn
http://castle.hyyxsc.cn
http://added.hyyxsc.cn
http://broomie.hyyxsc.cn
http://cacogenics.hyyxsc.cn
http://amain.hyyxsc.cn
http://auditing.hyyxsc.cn
http://capucine.hyyxsc.cn
http://bunghole.hyyxsc.cn
http://alpenglow.hyyxsc.cn
http://carib.hyyxsc.cn
http://biobibliography.hyyxsc.cn
http://benchman.hyyxsc.cn
http://analgesia.hyyxsc.cn
http://archaean.hyyxsc.cn
http://capillarimeter.hyyxsc.cn
http://bintree.hyyxsc.cn
http://blastomere.hyyxsc.cn
http://airbag.hyyxsc.cn
http://www.dtcms.com/a/281362.html

相关文章:

  • LSA链路状态通告
  • QT——文件选择对话框 QFileDialog
  • Transformer是什么 - 李沐论文《Attention Is All You Need》精读
  • 内网穿透实例:在 NAT 环境下通过 FRP 配置 ThinLinc 远程桌面 实现外网登录
  • zynq串口的例子
  • 自己训练大模型?MiniMind 全流程解析 (一) 预训练
  • 如何科学做好企业软件许可优化?
  • Day03_C语言网络编程20250715
  • Datawhale AI 夏令营第一期(机器学习方向)Task2 笔记:用户新增预测挑战赛 —— 从业务理解到技术实现
  • 如何理解flex: 1 1 50%
  • 【Unity基础】Unity中元素的层级排序
  • WPF,Winform,HTML5网页,哪个UI开发速度最快?
  • 线程(一) linux
  • 前端医疗生命体征
  • MIPI DSI(四) video 和 command 模式
  • 比较vue和react框架
  • Windows 下 Visual Studio 开发 C++ 项目的部署流程
  • Spring Boot 启动原理揭秘:从 main 方法到自动装配
  • 判断QMetaObject::invokeMethod()里的函数是否调用成功
  • Process Lasso:提升电脑性能的得力助手
  • C++20 协程参考手册详解 - 源自 cppreference.com
  • Expression 类的静态方法
  • PostgreSQL 大数据量(超过50GB)导出方案
  • 国产化Excel处理组件Spire.XLS教程:在 C# 中生成 Excel文件
  • 关于LM74700-Q1低IQ理想二极管的应用与参数极限
  • saltstack安装部署
  • 对象数组列表转成树形结构--树形结构转成列表(处理菜单)
  • ORA-06413: 连接未打开
  • 设计网站集:经济信息数据 统计数据 + 农业 + 金属 + 药品 + 电子 + 加密货币 + 债券 + 期货 + 其他
  • 构建企业级项目管理全面数字化运营体系︱易趋(蓝云软件)总裁唐智勇