如何通过Graph API删除SharePoint中AD用户的指定文件?
首先明确:用户的个人驱动器列表里不会包含SharePoint站点的文档库,因为SharePoint文档库属于站点资源而非用户个人驱动器。要处理用户有权限访问的SharePoint文件,需按以下步骤操作:
1. 获取用户有权限访问的SharePoint站点
使用Graph SDK调用站点列表接口,筛选用户可访问的站点。无人值守应用需提前申请Sites.Read.All或Sites.ReadWrite.All权限(根据是否需要删除操作选择)。
示例代码(C#):
var sites = await graphClient.Me.Sites .Request() .Filter("siteCollection/root ne null") // 过滤根站点及子站点 .GetAsync();
2. 遍历站点下的文档库
每个SharePoint站点下的文档库对应站点的驱动器,通过站点的Drives属性获取,此时driveType会是documentLibrary。
示例代码:
foreach (var site in sites) { var libraries = await graphClient.Sites[site.Id].Drives .Request() .Filter("driveType eq 'documentLibrary'") .GetAsync(); foreach (var library in libraries) { // 处理该文档库中的目标文件 await ProcessLibraryFiles(graphClient, library.Id, targetExtensions, 90); } }
3. 筛选并删除符合条件的文件
在文档库中查询修改时间超过90天、带有指定扩展名的文件,注意优化查询条件避免全量遍历。若需处理子文件夹,需递归遍历。
示例查询并删除文件的代码:
private async Task ProcessLibraryFiles(GraphServiceClient graphClient, string driveId, List<string> targetExtensions, int daysOld) { var cutoffDate = DateTime.UtcNow.AddDays(-daysOld); // 构建多扩展名筛选条件 var extensionFilters = string.Join(" or ", targetExtensions.Select(ext => $"endswith(name, '.{ext}')")); var filter = $"lastModifiedDateTime le '{cutoffDate:yyyy-MM-ddTHH:mm:ssZ}' and ({extensionFilters})"; var items = await graphClient.Drives[driveId].Root .Children .Request() .Filter(filter) .GetAsync(); foreach (var item in items) { if (item.File != null) // 仅处理文件,跳过文件夹 { await graphClient.Drives[driveId].Items[item.Id] .Request() .DeleteAsync(); } // 递归处理子文件夹 if (item.Folder != null) { await ProcessSubFolderFiles(graphClient, driveId, item.Id, targetExtensions, daysOld); } } } private async Task ProcessSubFolderFiles(GraphServiceClient graphClient, string driveId, string folderId, List<string> targetExtensions, int daysOld) { var cutoffDate = DateTime.UtcNow.AddDays(-daysOld); var extensionFilters = string.Join(" or ", targetExtensions.Select(ext => $"endswith(name, '.{ext}')")); var filter = $"lastModifiedDateTime le '{cutoffDate:yyyy-MM-ddTHH:mm:ssZ}' and ({extensionFilters})"; var items = await graphClient.Drives[driveId].Items[folderId] .Children .Request() .Filter(filter) .GetAsync(); foreach (var item in items) { if (item.File != null) { await graphClient.Drives[driveId].Items[item.Id].Request().DeleteAsync(); } if (item.Folder != null) { await ProcessSubFolderFiles(graphClient, driveId, item.Id, targetExtensions, daysOld); } } }
关键注意事项
- 权限配置:无人值守应用需在Azure AD中申请应用权限(而非委托权限),
Sites.ReadWrite.All是删除操作的最小权限要求。 - 分页处理:若站点或文件数量较多,必须处理Graph API的分页逻辑,通过
NextPageRequest迭代获取全部结果。 - 权限验证:部分私有SharePoint站点可能需要显式授权应用访问,需提前确认站点权限配置。
内容的提问来源于stack exchange,提问作者Chris Fellows
相关产品推荐
相关产品推荐

