OneDrive 空间删回 150GB 为何仍只读?一次 PowerShell 强制解锁踩坑记

最近在处理一个微软 365 账号的配额问题:因为之前存储空间爆满,OneDrive 被系统打上了只读标记。本以为只要把文件删掉、二级回收站彻底清空,把使用量降到 150GB(远低于 300GB 上限)就能恢复写入,结果网页端和客户端依然卡在只读状态。

为了立刻恢复写入权限,我打算用 PowerShell 连进后台把站点的只读锁(LockState)给强行解开,结果折腾了一圈。

截屏2026-07-30 10.14.09

尝试用 PowerShell 强行解锁

思路很简单:通过 SharePoint Online 模块连接管理中心,运行 Set-SPOSite 将站点的 LockState 重置为 Unlock

但在不同操作系统下,踩到的坑完全不同:

1. macOS 环境下的坑

在 Mac 上安装了 PowerShell (pwsh) 并加载微软官方的 Microsoft.Online.SharePoint.PowerShell 模块后,运行连接命令:

PowerShell

Connect-SPOService -Url https://<tenant>-admin.sharepoint.com

系统直接抛出空指针报错:Connect-SPOService: Object reference not set to an instance of an object.

这是因为该模块对 macOS 的跨平台支持有历史缺陷,依赖的部分 Windows 原生认证组件在 Mac 环境变量下为空,导致在 Mac 端无法完成 SPO 的身份验证。

截屏2026-07-30 10.11.07

2. 切到 Windows 排查真相

换到 Windows 电脑的 PowerShell 重新安装模块并连上后台后,我先查询了所有个人站点的底层锁定状态:

PowerShell

Get-SPOSite -IncludePersonalSite $true -Filter "Url -like '-my.sharepoint.com/personal/'" | Select-Object Url, LockState

输出结果让我有点意外:所有账号站点的 LockState 底层全部都是 Unlock(未锁定)

这意味着,站点本身根本就没有被单独施加“站点级只读锁”。

问题的真正原因

这次只读拦截是由微软的租户集区配额锁(Pooled Storage Cap)触发的:

  • 当全租户总用量超过配额上限时,微软会在最上层的网关层(Gateway)直接拦截写入操作,而不会去修改底层单个站点的 LockState 状态。
  • 即使手动删除了大量文件,微软后台的容量配额扫描任务(Quota Scan)也是定时轮询运行的,通常有 24 小时左右的系统延迟
  • 在后台定时任务扫描到租户容量已恢复合规之前,最上层的网关拦截会一直保持开启状态。

因此,只要确定二级回收站已经清空、真实空间已落回安全线内,就不需要再跑任何解锁命令,耐心等待后台自动对账刷新即可。

事后清理

排查结束后,将测试安装的临时模块与配置文件全部卸载清理,保持系统干净。

环境操作说明执行命令
Windows卸载 SPO 模块Uninstall-Module -Name Microsoft.Online.SharePoint.PowerShell -AllVersions -Force
Windows清理模块残余文件夹Remove-Item -Path "$env:USERPROFILE\Documents\WindowsPowerShell\Modules\Microsoft.Online.SharePoint.PowerShell" -Recurse -Force
macOS卸载 PowerShellbrew uninstall powershell
macOS清理配置文件及缓存rm -rf ~/.powershell ~/.local/share/powershell ~/.config/powershell

总结

  • macOS 跑 SPO 模块不太靠谱:管理 SharePoint/OneDrive 尽量用 Windows 原生 PowerShell,Mac 端的 pwsh 在运行部分微软官方旧模块时极易触发 NULL 异常。
  • 配额释放存在异步延迟:大批量删文件后,如果容量已降到线内但依然只读,无需跟 LockState 较劲,后台 Cron Job 在 24 小时内更新对账后就会自动解除限制。