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

如何通过Microsoft Graph API访问SharePoint权限受限的嵌套文件夹并下载文件?

使用Microsoft Graph API下载SharePoint文件时的权限问题

我正在开发一个C#应用程序,通过Microsoft Graph API从SharePoint文档库下载文件。目前遇到权限相关的问题:当登录用户仅拥有文档库中特定嵌套文件夹的访问权限时,调用API访问该文件夹会返回空的value数组。比如用户拥有Document/Blackout文件夹权限时,代码能正常返回内容;但仅拥有Native Draft文件夹权限时,返回的value对象为空。

关键代码片段:

jsonDocument.RootElement.GetProperty("value").EnumerateArray()

API返回空value的示例截图:
API返回空value的示例截图

完整代码如下:

public async Task<bool> DownloadDrive(CancellationToken cancellationToken)
{
    OutputWindow.Info($"Start DownloadDrive.", _resultText);
    string siteId = "XXXXXXXXXXXXXXXXXXXXXXXX";
    string libraryUrl = "https://XXXXXX/sites/{sitename}/Shared%20Documents";
    string driveId = await GetDriveId(siteId, libraryUrl);
    if (string.IsNullOrEmpty(driveId))
    {
        OutputWindow.Info($"SharePoint Library under {libraryUrl} could not be found.", _resultText);
        return false;
    }

    if (Directory.Exists(_localFolder))
    {
        Directory.Delete(_localFolder, true);
    }
    Directory.CreateDirectory(_localFolder);

    await DownloadLibrary(driveId, _localFolder);
    return true;
}

private async Task<string> GetDriveId(string siteId, string libraryUrl)
{
    var requestUrl = $"https://graph.microsoft.com/v1.0/sites/{siteId}/drives";
    var response = await _httpClient.GetAsync(requestUrl);
    response.EnsureSuccessStatusCode();

    var responseContent = await response.Content.ReadAsStringAsync();
    var jsonDocument = JsonDocument.Parse(responseContent);
    foreach (var drive in jsonDocument.RootElement.GetProperty("value").EnumerateArray())
    {
        if (drive.GetProperty("webUrl").GetString() == libraryUrl)
        {
            return drive.GetProperty("id").GetString();
        }
    }

    return null;
}

private async Task DownloadLibrary(string driveId, string path)
{
    var requestUrl = $"https://graph.microsoft.com/v1.0/drives/{driveId}/root/children";
    var response = await _httpClient.GetAsync(requestUrl);
    response.EnsureSuccessStatusCode();

    var responseContent = await response.Content.ReadAsStringAsync();
    var jsonDocument = JsonDocument.Parse(responseContent);
    foreach (var driveItem in jsonDocument.RootElement.GetProperty("value").EnumerateArray())
    {
        await DownloadDriveItem(driveItem, driveId, path);
    }
}

private async Task DownloadDriveItem(JsonElement driveItem, string driveId, string path)
{
    string itemName = driveItem.GetProperty("name").GetString() ?? string.Empty;
    OutputWindow.Info($"{itemName}", _resultText);
    if (!driveItem.TryGetProperty("@microsoft.graph.downloadUrl", out var downloadUrl))
    {
        OutputWindow.Info($"Downloading the folder {driveItem.GetProperty("webUrl").GetString()}", _resultText);

        var folderPath = System.IO.Path.Combine(path, driveItem.GetProperty("name").GetString());
        Directory.CreateDirectory(folderPath);

        var requestUrl = $"https://graph.microsoft.com/v1.0/drives/{driveId}/items/{driveItem.GetProperty("id").GetString()}/children";
        var response = await _httpClient.GetAsync(requestUrl);
        response.EnsureSuccessStatusCode();

        var responseContent = await response.Content.ReadAsStringAsync();
        var jsonDocument = JsonDocument.Parse(responseContent);
        foreach (var childItem in jsonDocument.RootElement.GetProperty("value").EnumerateArray())
        {
            await DownloadDriveItem(childItem, driveId, folderPath);
        }
    }
    else
    {
        OutputWindow.Info($"Downloading the file {driveItem.GetProperty("webUrl").GetString()}", _resultText);

        var filePath = System.IO.Path.Combine(path, driveItem.GetProperty("name").GetString());
        var fileResponse = await _httpClient.GetAsync(downloadUrl.GetString());
        fileResponse.EnsureSuccessStatusCode();

        await using var fileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write);
        await fileResponse.Content.CopyToAsync(fileStream);
    }
}

内容的提问来源于stack exchange,提问作者Mannan Bahelim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 00:49:59