引言:当管理中心突然"消失",你的Plan B是什么?
2026年2月10日,一个再普通不过的工作日早晨,全球数千名IT管理员像往常一样打开浏览器,准备登录Microsoft 365管理中心——结果发现页面一片空白。没有报错,没有转圈的加载动画,就是……什么都没有。说实话,那种感觉就像你到了办公室才发现门锁换了。
这就是微软追踪编号MO1012599事件的开端。北美地区的企业和商业客户首先中招,随后波及全球。管理员们无法登录管理中心,已经登进去的也碰上了功能失灵、页面加载慢得像拨号上网等各种问题。最讽刺的是——你想去管理中心查看服务健康状态,但管理中心本身就是挂掉的那个服务。
这次事件戳破了一个很多人不愿面对的现实:太多组织把所有管理操作都押在了Web管理中心这一个入口上。当这个入口崩了,密码重置、许可证分配、新建用户……日常操作全部停摆。
好消息是,微软在设计Microsoft 365时就提供了多条管理路径。PowerShell和Microsoft Graph API可以在管理中心宕机时继续工作——2月的那次事件中,部分管理员确认PowerShell命令仍然畅通无阻。坏消息呢?大多数IT团队压根就没认真准备过这套"B计划"。
这篇指南就是帮你把这个Plan B建起来。从环境搭建到核心命令,从真实应急场景到长期规划,我们一步步来。下次管理中心再挂掉的时候,你不用干等着微软修——你可以自己动手解决问题。
事件回顾:2026年Microsoft 365管理中心到底怎么了?
1月全球大规模宕机
2026年1月22日,Microsoft 365遭遇了一次全球性服务中断。Outlook、Teams、OneDrive等核心服务同时受到影响,数万用户无法访问邮件、文件和在线会议。微软给出的官方解释是"服务基础设施未按预期处理流量"——说白了就是流量管理出了问题。修复过程涉及流量重新均衡和恢复工作,整个事件前后持续了8到9个小时。
这次宕机的关键教训:微软最核心的共享服务同时失效,而自动故障转移系统并没能阻止长时间中断。这一点挺让人意外的。
2月管理中心专项宕机
1月那次的余温还没散,不到三周后的2月10日,管理中心又出事了。
这次的特殊之处在于:不是Outlook或Teams用不了——而是管理员用来管理一切的控制台本身瘫痪了。你可以想象一下消防局着火了的感觉。
受影响的功能包括:
- 用户账户管理(创建、修改、删除)
- 许可证分配和调整
- 安全策略配置
- 服务健康状态查看(对,就是那个讽刺的循环)
- 部分Microsoft Graph API端点也出现间歇性故障
微软在当天下午约13:56 EST确认问题已修复。但老实说,对于中间那几个小时无法执行任何管理操作的团队来说,伤害已经造成了。
历史规律:这不是"会不会"的问题
分析历史数据你会发现一个规律:Microsoft 365大约每年经历2到3次显著服务中断,每18到24个月会出现一次持续4小时以上的重大宕机。所以这真不是"会不会发生"的问题——而是"下一次什么时候来"的问题。
环境准备:搭建你的PowerShell应急管理工具箱
系统要求
动手之前,先确认你的环境满足以下条件:
- 操作系统:Windows 10/11、Windows Server 2016+、macOS或Linux
- PowerShell版本:PowerShell 5.1(Windows自带)或PowerShell 7+(推荐,跨平台支持更好)
- .NET Framework:4.7.2或更高版本
- 账户权限:全局管理员、用户管理员或许可证管理员(具体看你要做什么操作)
安装核心模块
你需要装三个关键模块。以管理员身份打开PowerShell,依次执行下面的命令:
1. Microsoft Graph PowerShell SDK(核心模块)
# 安装Microsoft Graph核心模块
Install-Module -Name Microsoft.Graph -Scope CurrentUser -Force
# 如果只需要特定功能,可以只装子模块来节省空间
Install-Module -Name Microsoft.Graph.Users -Scope CurrentUser -Force
Install-Module -Name Microsoft.Graph.Groups -Scope CurrentUser -Force
Install-Module -Name Microsoft.Graph.Identity.DirectoryManagement -Scope CurrentUser -Force
Install-Module -Name Microsoft.Graph.Devices.ServiceAnnouncement -Scope CurrentUser -Force
2. Exchange Online管理模块
# 安装Exchange Online管理模块
Install-Module -Name ExchangeOnlineManagement -Scope CurrentUser -Force
3. Microsoft Teams模块(可选,但建议装上)
# 安装Teams管理模块
Install-Module -Name MicrosoftTeams -Scope CurrentUser -Force
划重点:千万不要等到宕机那天才想起来装这些模块。PSGallery本身也跑在微软的基础设施上,微软出问题的时候它也可能受波及。趁现在就装好,隔段时间更新一下。
验证安装并建立连接
装完以后,跑一下测试确认连接正常:
# 验证模块版本
Get-InstalledModule -Name Microsoft.Graph | Select-Object Name, Version
Get-InstalledModule -Name ExchangeOnlineManagement | Select-Object Name, Version
# 测试连接Microsoft Graph(交互式登录,支持MFA)
Connect-MgGraph -Scopes "User.Read.All","Organization.Read.All"
# 确认连接成功
Get-MgContext | Select-Object Account, TenantId, Scopes
# 断开连接
Disconnect-MgGraph
如果看到"Welcome to Microsoft Graph!"的提示信息,恭喜,连接没问题。
配置无人值守认证(进阶操作)
对于自动化脚本和紧急情况,强烈建议提前配置好基于证书的应用认证。这样即使交互式MFA登录出了问题,你也能执行管理操作:
# 第一步:创建自签名证书(生产环境建议用CA签发的证书)
$certName = "M365EmergencyAdmin"
$cert = New-SelfSignedCertificate -Subject "CN=$certName" `
-CertStoreLocation "Cert:\CurrentUser\My" `
-KeyExportPolicy Exportable `
-KeySpec Signature `
-KeyLength 2048 `
-NotAfter (Get-Date).AddYears(2)
# 导出公钥证书(上传到Azure AD应用注册)
Export-Certificate -Cert $cert -FilePath "C:\Certs\$certName.cer"
# 记录证书指纹
$cert.Thumbprint
然后到Azure Portal注册一个应用,把证书上传上去,授予需要的API权限。搞定之后就可以这样连接了:
# 使用证书进行无人值守连接
Connect-MgGraph -ClientId "你的应用ID" `
-TenantId "你的租户ID" `
-CertificateThumbprint "你的证书指纹"
核心应急场景一:用户账户管理
查看用户信息
# 连接(需要User.Read.All权限)
Connect-MgGraph -Scopes "User.Read.All"
# 查看所有用户列表
Get-MgUser -All | Select-Object DisplayName, UserPrincipalName, AccountEnabled
# 查看特定用户详情
Get-MgUser -UserId "[email protected]" | Format-List
# 查看被禁用的账户
Get-MgUser -All -Filter "accountEnabled eq false" | Select-Object DisplayName, UserPrincipalName
紧急重置密码
这大概是宕机期间最常见的求助了。员工账户被锁了,管理中心又打不开——这时候PowerShell就是你的救星。
# 连接(需要UserAuthenticationMethod.ReadWrite.All权限)
Connect-MgGraph -Scopes "UserAuthenticationMethod.ReadWrite.All"
# 为用户重置密码
$params = @{
passwordProfile = @{
forceChangePasswordNextSignIn = $true
password = "Temp@Pass2026!"
}
}
Update-MgUser -UserId "[email protected]" -BodyParameter $params
Write-Host "密码已重置,用户下次登录时需设置新密码"
创建新用户
新人入职可不能等管理中心恢复。下面是用PowerShell创建用户的完整流程:
# 连接(需要User.ReadWrite.All权限)
Connect-MgGraph -Scopes "User.ReadWrite.All"
# 创建新用户
$newUser = @{
accountEnabled = $true
displayName = "李四"
mailNickname = "lisi"
userPrincipalName = "[email protected]"
usageLocation = "CN"
passwordProfile = @{
forceChangePasswordNextSignIn = $true
password = "Welcome@2026!"
}
}
New-MgUser -BodyParameter $newUser
禁用离职员工账户
员工离职安全处理刻不容缓,尤其是管理中心不可用的时候:
# 立即禁用账户
Update-MgUser -UserId "離職员工@contoso.com" -AccountEnabled:$false
# 同时撤销所有活跃会话(强制登出)
Revoke-MgUserSignInSession -UserId "離職员工@contoso.com"
Write-Host "账户已禁用,所有会话已撤销"
核心应急场景二:许可证管理
查看租户许可证概览
# 连接(需要Organization.Read.All权限)
Connect-MgGraph -Scopes "Organization.Read.All"
# 查看所有许可证订阅
Get-MgSubscribedSku | Select-Object SkuPartNumber, `
@{N="总数";E={$_.PrepaidUnits.Enabled}}, `
@{N="已分配";E={$_.ConsumedUnits}}, `
@{N="可用";E={$_.PrepaidUnits.Enabled - $_.ConsumedUnits}} |
Format-Table -AutoSize
跑完之后你会看到类似这样的输出:
SkuPartNumber 总数 已分配 可用
------------- ---- ------ ----
ENTERPRISEPACK 500 467 33
ENTERPRISEPREMIUM 50 48 2
TEAMS_EXPLORATORY 100 23 77
一目了然,哪些许可证快用完了心里立马有数。
为用户分配许可证
# 连接(需要User.ReadWrite.All和Organization.Read.All权限)
Connect-MgGraph -Scopes "User.ReadWrite.All","Organization.Read.All"
# 先获取许可证SKU ID
$skuId = (Get-MgSubscribedSku | Where-Object {$_.SkuPartNumber -eq "ENTERPRISEPACK"}).SkuId
# 为用户分配许可证
Set-MgUserLicense -UserId "[email protected]" -AddLicenses @(
@{SkuId = $skuId}
) -RemoveLicenses @()
Write-Host "E3许可证已分配成功"
踩坑提醒:分配许可证之前一定要确保用户的UsageLocation(使用位置)已经设好,不然会直接报错。如果建用户的时候忘了设,赶紧补上:
Update-MgUser -UserId "[email protected]" -UsageLocation "CN"
查看特定用户的许可证详情
# 查看用户已分配的许可证
Get-MgUserLicenseDetail -UserId "[email protected]" |
Select-Object SkuPartNumber, SkuId
批量为未授权用户分配许可证
如果有一批新用户等着分配许可证(比如批量入职的情况),可以用脚本一次搞定:
# 找到所有没有许可证的用户
$unlicensedUsers = Get-MgUser -All -Filter "assignedLicenses/`$count eq 0" `
-ConsistencyLevel eventual -CountVariable count |
Where-Object {$_.UserType -eq "Member"}
$skuId = (Get-MgSubscribedSku | Where-Object {$_.SkuPartNumber -eq "ENTERPRISEPACK"}).SkuId
foreach ($user in $unlicensedUsers) {
# 确保设置了使用位置
if (-not $user.UsageLocation) {
Update-MgUser -UserId $user.Id -UsageLocation "CN"
}
# 分配许可证
Set-MgUserLicense -UserId $user.Id -AddLicenses @(
@{SkuId = $skuId}
) -RemoveLicenses @()
Write-Host "已为 $($user.DisplayName) 分配许可证"
}
核心应急场景三:Exchange Online邮箱管理
连接到Exchange Online
# 交互式连接(支持MFA)
Connect-ExchangeOnline -UserPrincipalName "[email protected]"
# 证书连接(无人值守)
Connect-ExchangeOnline -CertificateThumbprint "证书指纹" `
-AppId "应用ID" `
-Organization "contoso.onmicrosoft.com"
管理邮箱
# 查看所有邮箱
Get-EXOMailbox -ResultSize Unlimited |
Select-Object DisplayName, PrimarySmtpAddress, RecipientTypeDetails
# 查看邮箱大小和配额
Get-EXOMailboxStatistics -Identity "[email protected]" |
Select-Object DisplayName, TotalItemSize, ItemCount
# 设置邮箱自动回复(比如员工临时紧急休假)
Set-MailboxAutoReplyConfiguration -Identity "[email protected]" `
-AutoReplyState Enabled `
-InternalMessage "我目前不在办公室,请联系[email protected]" `
-ExternalMessage "I am currently out of office."
管理通讯组和共享邮箱
# 创建共享邮箱
New-Mailbox -Shared -Name "技术支持" -DisplayName "技术支持" `
-PrimarySmtpAddress "[email protected]"
# 授予用户访问共享邮箱的权限
Add-MailboxPermission -Identity "[email protected]" `
-User "[email protected]" `
-AccessRights FullAccess `
-AutoMapping $true
# 向通讯组添加成员
Add-DistributionGroupMember -Identity "IT团队" -Member "[email protected]"
邮件追踪(排查邮件去哪了)
邮件发出去了但对方说没收到?2026年起微软推荐用新版Message Trace V2 cmdlet来排查:
# 追踪过去48小时内特定发件人的邮件
Get-MessageTraceV2 -SenderAddress "[email protected]" `
-StartDate (Get-Date).AddHours(-48) `
-EndDate (Get-Date) |
Select-Object Received, SenderAddress, RecipientAddress, Subject, Status |
Format-Table -AutoSize
核心应急场景四:服务健康监控
管理中心挂了的时候,你还是得想办法知道到底哪些服务有问题、哪些没问题。
通过PowerShell查看服务健康状态
# 连接(需要ServiceHealth.Read.All权限)
Connect-MgGraph -Scopes "ServiceHealth.Read.All"
# 查看所有服务的健康状态概览
Get-MgServiceAnnouncementHealthOverview |
Select-Object Service, Status |
Format-Table -AutoSize
# 只看有问题的服务
Get-MgServiceAnnouncementHealthOverview |
Where-Object {$_.Status -ne "ServiceOperational"} |
Select-Object Service, Status
查看活跃的服务事件详情
# 查看当前活跃的服务问题
Get-MgServiceAnnouncementIssue -Filter "isResolved eq false" |
Select-Object Id, Title, Service, Classification,
StartDateTime, @{N="影响";E={$_.ImpactDescription}} |
Format-List
第三方监控替代方案
除了PowerShell,还有几个渠道可以获取服务状态信息(建议都存到书签里):
- Microsoft 365状态页面:https://status.cloud.microsoft — 独立于管理中心,通常还能访问
- Microsoft 365管理移动App:iOS和Android都有,Web端挂掉时它有时还能用
- Twitter/X上的@MSABORSK账号:微软官方服务状态更新渠道
- DownDetector等第三方平台:社区用户的报告往往比微软官方公告来得更早(亲测如此)
2026年关键变更:你的脚本可能要改了
如果你还在用老的PowerShell模块和认证方式,2026年有好几个重要的截止日期需要留意。忽略这些变更的后果就是——脚本某天突然不好使了,而且很可能偏偏在你最需要它的时候。
| 日期 | 变更内容 | 影响 |
|---|---|---|
| 2026年1月31日 | IDCRL传统身份验证停止支持 | 依赖IDCRL的SharePoint/OneDrive脚本将失效 |
| 2026年3月1日 | Exchange Online SMTP AUTH基本身份验证退休 | 用基本身份验证发邮件的应用和设备将无法工作 |
| 2026年3月31日 | Office 365 Teams连接器退休 | 依赖传统连接器的自动化流程需要迁移 |
| 2026年4月2日 | Azure ACS在Microsoft 365中退休 | 使用ACS令牌的SharePoint插件将停止工作 |
| 2026年6月后 | Exchange Online PowerShell弃用Credential参数 | 用PSCredential连接的脚本需迁移到现代认证 |
| 2026年10月13日 | Office 2021终止支持 | 不再获得安全更新 |
现在就该动手的事:
- 把所有用
Connect-MsolService的脚本迁移到Connect-MgGraph - 把用基本身份验证的SMTP发送脚本改成OAuth认证
- 把用
-Credential参数连接Exchange Online的脚本改成证书认证或托管标识 - 用
Get-MessageTraceV2替换掉旧版Get-MessageTrace
构建长效应急预案:不止于PowerShell
建立应急操作手册
这一步其实比学PowerShell命令更重要。把以下内容整理成文档,存在不依赖Microsoft 365的地方——本地服务器、非微软云存储,甚至打印一份纸质版(没错,2026年了,纸质文档在某些时刻依然是最靠谱的):
- 所有管理员账户的UPN和角色
- Azure AD应用注册信息(AppId、TenantId、证书指纹)
- 关键PowerShell连接命令速查表
- 常用应急操作脚本(密码重置、许可证分配、账户禁用)
- 第三方监控工具的访问地址和凭据
- 微软支持热线和工单提交方式
定期演练
手册写完了不等于万事大吉。每季度至少搞一次"管理中心宕机演练":
- 假设管理中心完全不可用,只能通过PowerShell完成这些操作:
- 查看租户用户和许可证状态
- 为测试用户重置密码
- 查看服务健康状态
- 检查邮件流是否正常
- 记录每个操作的耗时和碰到的问题
- 更新手册中过期的信息
我知道这听起来有点"形式主义",但信我——真正宕机的时候,平时练过和没练过的团队表现差距是巨大的。
多人能力储备
千万不要让PowerShell应急管理变成团队里某一个人的"独门绝技"。那个人请假了怎么办?离职了呢?确保至少有2到3个人具备以下能力:
- 能独立连接Microsoft Graph和Exchange Online PowerShell
- 能执行基本的用户和许可证管理操作
- 了解证书认证怎么配
- 知道应急操作手册放在哪里
常见问题解答
管理中心宕机时PowerShell一定能用吗?
不一定,得看情况。在2026年2月的事件中,部分管理员反馈PowerShell和Graph API仍然可用,但也有人碰到了间歇性连接问题。如果底层的Microsoft Graph API端点本身也受影响,PowerShell自然也用不了。不过从历史来看,API层通常比Web界面恢复得更快,所以PowerShell仍然是管理中心挂掉时最值得第一个尝试的方案。
AzureAD和MSOnline模块还能用吗?
微软已经正式弃用了AzureAD和MSOnline(MSOL)PowerShell模块,官方建议全部迁移到Microsoft Graph PowerShell SDK。虽然截至2026年初这些旧模块在某些场景下可能还能跑,但别心存侥幸——它们随时可能彻底停止工作,而且不再有任何更新和支持。趁早迁移,别等到出问题再手忙脚乱。
小型企业没有专业IT人员怎么办?
小型企业确实比较尴尬,但也不是完全没办法。几个建议:第一,至少让一个人学会基础的PowerShell连接和密码重置——这是宕机期间被求助最多的操作。第二,Microsoft 365管理移动App可以作为轻量级备选工具,不需要PowerShell基础也能用。第三,考虑跟MSP(托管服务提供商)签一个应急支持协议,宕机时有专业人员可以远程帮忙,花点钱买个安心。
怎么提前知道微软服务要出问题了?
说实话,你没法"预知"宕机,但可以做到尽早发现。配置多渠道监控是关键:用PowerShell脚本定时查询Get-MgServiceAnnouncementHealthOverview并发送告警邮件或消息;订阅Microsoft 365服务健康邮件通知;关注DownDetector这类第三方平台;加入IT管理员社区(Reddit的r/sysadmin就是个不错的信息来源)。根据经验,第三方工具和社区反馈通常比微软官方公告来得更快。
Exchange Online的Credential参数被弃用后怎么连接?
从2026年6月之后发布的Exchange Online管理模块版本开始,-Credential参数将不再可用。替代方案有几种:交互式登录就用Connect-ExchangeOnline -UserPrincipalName [email protected](自动支持MFA);自动化脚本用证书认证Connect-ExchangeOnline -CertificateThumbprint;跑在Azure上的就用托管标识。建议现在就审计一遍所有用了-Credential参数的脚本,趁还没到截止日期赶紧改掉。