Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Microsoft graph api 代表来宾用户访问sharepoint文件_Microsoft Graph Api_Sharepoint Online - Fatal编程技术网

Microsoft graph api 代表来宾用户访问sharepoint文件

Microsoft graph api 代表来宾用户访问sharepoint文件,microsoft-graph-api,sharepoint-online,Microsoft Graph Api,Sharepoint Online,我正在尝试访问Sharepoint Online中与B2B来宾用户共享的文件。我已经在Azure广告中添加了该用户,并授予他们访问sharepoint网站中某些文件和文件夹的权限。他们可以通过web门户访问此文件,但当我通过graph API以他们的身份登录时,文件不会显示 当我作为Azure AD(非来宾)用户执行此代码时,它运行OK并返回我有权访问的站点: var sites = await _graphClient.Sites.Request(new List<QueryOption

我正在尝试访问Sharepoint Online中与B2B来宾用户共享的文件。我已经在Azure广告中添加了该用户,并授予他们访问sharepoint网站中某些文件和文件夹的权限。他们可以通过web门户访问此文件,但当我通过graph API以他们的身份登录时,文件不会显示

当我作为Azure AD(非来宾)用户执行此代码时,它运行OK并返回我有权访问的站点:

var sites = await _graphClient.Sites.Request(new List<QueryOption>()
                                    {
                                        new QueryOption("search", "")
                                    }).GetAsync();
var sites=await\u graphClient.sites.Request(新列表()
{
新的查询选项(“搜索”,“搜索”)
}).GetAsync();
但是,当我以来宾用户身份登录时,会出现以下错误:

ServiceException:代码:itemNotFound消息:找不到项


对来宾用户有什么限制吗?如何查看与此用户共享的所有文件?

因此,似乎可以以稍微复杂一点的方式查看。由于我们不能使用搜索,这意味着我们必须保留一个(来宾)用户注册到的所有sharepoint网站的列表

我注意到,
var sites=await\u graphClient.sites.Request().GetAsync()
不会返回错误,而是提供一个空数组

首先,我们需要知道Sharepoint站点ID。
Sites
资源有一个名为
GetByPath
的方法。这允许我们检索站点数据:

var site = await _graphClient.Sites.GetByPath("/sites/Contoso-Customer1",
                      "contoso.sharepoint.com").Request().GetAsync();
第一个参数是站点url,第二个参数是站点域。上面的示例显示了的值

现在我们可以获取站点ID并列出驱动器。为了简洁起见,我在这里的示例中省略了几个空检查。 以下线路将为我们提供驱动器:

var drives = await _graphClient.Sites[site.Id].Drives.Request().GetAsync();
我想只有一个驱动器。检索驱动器ID就像
var driveId=drives.First().ID

然后我们需要列表的ID。该列表包含文件和文件夹

var list = await _graphClient.Sites[site.Id]
                             .Drives[driveId]
                             .List
                             .Request()
                             .GetAsync();
(编辑:我们也可以绕过驱动器查询直接获取列表:
var lists=await\u graphClient.Sites[site.Id].lists.Request().GetAsync();
。然后列表Id是
lists.First().Id

接下来,我们可以检索列表中的所有项目:

var listContent = await _graphClient.Sites[site.Id]
                               .Lists[list.Id]
                               .Items
                               .Request()
                               .GetAsync();
现在我们可以得到所有详细的文件信息。对于本例,我仅检索文件名:

 List<string> fileNames = new List<string>();
 foreach (var item in listContent)
 {
     var file = await _graphClient.Sites[site.Id].Lists[list.Id].Items[item.Id].DriveItem.Request().GetAsync();
     fileNames.Add(file?.Name);
 }
\u graphClient
变量基于教程)

listContent?.Select(x => new
            {
                x.Id, // id of item in the list
                x.Name, // null
                x.ContentType,
                DriveItemName = x.DriveItem?.Name, // null
                x.WebUrl, // exact url to file
            }),