如何通过PowerShell或自动化工具批量删除SharePoint中未使用的共享链接?
前置条件
在执行脚本前,请确保满足以下要求:
- 安装 PnP PowerShell 模块(SharePoint Online管理的常用工具):
Install-Module -Name PnP.PowerShell -Force -AllowClobber - 拥有目标SharePoint站点的站点集管理员权限,或具备管理共享链接的足够权限。
- 使用支持交互式登录的账号(需MFA的账号也可通过交互式方式验证)。
完整PowerShell脚本
该脚本会:
- 连接到指定SharePoint站点
- 筛选出所有外部共享链接
- 检查链接的最后访问时间(超过指定天数则判定为未使用)
- 批量删除符合条件的链接
# 配置参数 $siteUrl = "https://contoso.sharepoint.com/sites/YourTargetSite" # 替换为你的站点URL $unusedThresholdDays = 90 # 设定未使用天数阈值,例如90天 $logFilePath = ".\DeletedSharingLinks.log" # 日志文件路径 # 初始化日志文件 "[$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')] 开始执行批量删除未使用共享链接任务" | Out-File $logFilePath -Append try { # 连接到SharePoint站点 Write-Host "正在连接到站点:$siteUrl" -ForegroundColor Cyan Connect-PnPOnline -Url $siteUrl -Interactive # 获取所有包含外部共享链接的文件和文件夹 Write-Host "正在检索所有外部共享链接..." -ForegroundColor Cyan $sharedItems = Get-PnPSiteListItem -List "Documents" -Query "<View Scope='RecursiveAll'><Query><Where><Eq><FieldRef Name='SharedWithUsers' /><Value Type='Boolean'>True</Value></Eq></Where></Query></View>" $deletedCount = 0 foreach ($item in $sharedItems) { # 获取当前项目的所有共享链接 $sharingLinks = Get-PnPSharingLink -List "Documents" -Identity $item.Id -IncludeUsageInformation foreach ($link in $sharingLinks) { # 筛选外部共享链接且超过未使用阈值的链接 if ($link.IsExternal -and $link.LastAccessedDateTime) { $daysSinceLastAccess = (Get-Date) - $link.LastAccessedDateTime if ($daysSinceLastAccess.TotalDays -ge $unusedThresholdDays) { try { # 删除共享链接 Remove-PnPSharingLink -List "Documents" -Identity $item.Id -Token $link.Token -Force $deletedCount++ "[$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')] 已删除链接:$($link.Link) | 最后访问时间:$($link.LastAccessedDateTime)" | Out-File $logFilePath -Append Write-Host "已删除未使用链接:$($link.Link)" -ForegroundColor Green } catch { "[$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')] 删除失败:$($link.Link) | 错误信息:$($_.Exception.Message)" | Out-File $logFilePath -Append Write-Host "删除链接失败:$($link.Link),错误:$($_.Exception.Message)" -ForegroundColor Red } } } # 处理从未被访问过的链接(LastAccessedDateTime为空) elseif ($link.IsExternal -and !$link.LastAccessedDateTime) { try { Remove-PnPSharingLink -List "Documents" -Identity $item.Id -Token $link.Token -Force $deletedCount++ "[$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')] 已删除从未被访问的链接:$($link.Link)" | Out-File $logFilePath -Append Write-Host "已删除从未被访问的链接:$($link.Link)" -ForegroundColor Green } catch { "[$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')] 删除失败:$($link.Link) | 错误信息:$($_.Exception.Message)" | Out-File $logFilePath -Append Write-Host "删除链接失败:$($link.Link),错误:$($_.Exception.Message)" -ForegroundColor Red } } } } "[$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')] 任务完成,共删除$deletedCount个未使用外部共享链接" | Out-File $logFilePath -Append Write-Host "任务完成,共删除$deletedCount个未使用外部共享链接,详情请查看日志:$logFilePath" -ForegroundColor Cyan } catch { "[$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')] 脚本执行出错:$($_.Exception.Message)" | Out-File $logFilePath -Append Write-Host "脚本执行出错:$($_.Exception.Message)" -ForegroundColor Red } finally { # 断开连接 Disconnect-PnPOnline }
脚本说明
- 参数配置:
$siteUrl:替换为你要操作的SharePoint站点URL$unusedThresholdDays:设置判定为"未使用"的天数(例如90天未访问则删除)$logFilePath:日志文件保存路径,记录删除成功/失败的链接信息
- 核心逻辑:
- 使用
Get-PnPSiteListItem检索所有已共享的文件/文件夹 - 通过
Get-PnPSharingLink -IncludeUsageInformation获取链接的访问统计数据 - 筛选出外部共享链接,判断是否超过未使用阈值或从未被访问
- 调用
Remove-PnPSharingLink批量删除符合条件的链接
- 使用
- 日志记录:所有操作都会写入日志文件,方便后续核查
注意事项
- 测试先行:建议先在测试站点或小范围内测试脚本,可在
Remove-PnPSharingLink命令后添加-WhatIf参数预览删除操作,避免误删重要链接。 - 权限验证:确保登录账号拥有足够权限,否则会出现删除失败的情况。
- 大站点优化:如果站点文件数量极大,可添加分页逻辑或按库分批处理,避免超时或性能问题。
- 数据备份:执行删除前建议对重要文件/链接进行备份,防止不可逆操作。
内容的提问来源于stack exchange,提问作者Elvis Osman
相关产品推荐
相关产品推荐

