OneDrive 空间删回 150GB 为何仍只读?一次 PowerShell 强制解锁踩坑记
最近在处理一个微软 365 账号的配额问题:因为之前存储空间爆满,OneDrive 被系统打上了只读标记。本以为只要把文件删掉、二级回收站彻底清空,把使用量降到 150GB(远低于 300GB 上限)就能恢复写入,结果网页端和客户端依然卡在只读状态。
为了立刻恢复写入权限,我打算用 PowerShell 连进后台把站点的只读锁(LockState)给强行解开,结果折腾了一圈。

尝试用 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 的身份验证。

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 | 卸载 PowerShell | brew uninstall powershell |
| macOS | 清理配置文件及缓存 | rm -rf ~/.powershell ~/.local/share/powershell ~/.config/powershell |
总结
- macOS 跑 SPO 模块不太靠谱:管理 SharePoint/OneDrive 尽量用 Windows 原生 PowerShell,Mac 端的
pwsh在运行部分微软官方旧模块时极易触发 NULL 异常。 - 配额释放存在异步延迟:大批量删文件后,如果容量已降到线内但依然只读,无需跟
LockState较劲,后台 Cron Job 在 24 小时内更新对账后就会自动解除限制。