You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Graph API删除SharePoint中AD用户的指定文件?

解决SharePoint文档库文件清理的正确路径

首先明确:用户的个人驱动器列表里不会包含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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 00:57:41