C# 通过CSOM向外部和内部用户共享Sharepoint中的文件夹

C# 通过CSOM向外部和内部用户共享Sharepoint中的文件夹,c#,sharepoint-online,csom,asp.net-core-3.1,C#,Sharepoint Online,Csom,Asp.net Core 3.1,在某些情况下,我目前正在构建一个应用程序,允许员工快速、轻松地将本地文件上载到SharePoint,并通过选择一些文件、输入一些客户的电子邮件将其共享给客户,然后返回一个链接。它主要是工作,但我遇到了一个问题,分享给特定的用户 如果我与一个不属于我的域的用户共享,他们将获得一个“共享链接” 如果我将共享给属于域的用户,他们将获得“直接访问”,从而使生成的共享链接对他们不可用 如果我将共享给我的域的外部用户,他们将获得“直接访问”,这也会使共享链接对他们不可用 如果你不明白我所说的“共享链接”

在某些情况下,我目前正在构建一个应用程序,允许员工快速、轻松地将本地文件上载到SharePoint,并通过选择一些文件、输入一些客户的电子邮件将其共享给客户,然后返回一个链接。它主要是工作,但我遇到了一个问题,分享给特定的用户

  • 如果我与一个不属于我的域的用户共享,他们将获得一个“共享链接”
  • 如果我将共享给属于域的用户,他们将获得“直接访问”,从而使生成的共享链接对他们不可用
  • 如果我将共享给我的域的外部用户,他们将获得“直接访问”,这也会使共享链接对他们不可用
如果你不明白我所说的“共享链接”是什么意思,那么这是关于共享点的部分:

我不喜欢匿名链接,因为在我的应用程序中,我已经有了一个匿名链接选项

我的目标是将用户添加到共享链接,无论他们是谁,这可以手动完成(我可以手动进入sharepoint,将用户添加到直接访问和共享链接访问),但我无法通过CSOM了解如何完成

我目前拥有的生成共享链接的功能如下:

    /// <summary>
    /// Creates a share link for specific users
    /// </summary>
    /// <param name="context"></param>
    /// <param name="site">full link to the folder being shared</param>
    /// <param name="emails">List of all emails the folder is being shared to</param>
    /// <param name="view">Does this user have view permissions? True = view, false = view & edit</param>
    /// <returns>The link</returns>
    private string GenerateSpecificLink(ClientContext context, string site, List<string> emails, bool view)
    {
        var link = "Link not generated";

        List<string> successfulEmails = new List<string>();

        //Create a new link for each user as a link can only be made for one user at a time
        foreach (string email in emails)
        {
            SharingResult result = null;
            //if the user has view permissions
            if (view)
            {
                //the sendEmail bool in the ShareDocument() function is set to false as when it is true, it will send an email to the users automatically that will end up in the spam folder most of the time
                //by setting this to false, the user can create their own email with the link to send to the shared user, which will be of much higher quality and wont end up in a spam folder
                result = context.Web.ShareDocument(site,
                    email,
                    ExternalSharingDocumentOption.View,
                    false,
                    "Document Shared as test");
            }
            //if the user has view & edit permissions
            else
            {
                result = context.Web.ShareDocument(site,
                    email,
                    ExternalSharingDocumentOption.Edit,
                    false,
                    "Document Shared as test");
            }

            //if we did successfully share the document, get the link
            //ShareLinks are in the form "fullURLLink?user", so we can just trim off the "?user" and get a link that works for *all* users that have been specified
            if (result != null)
            {
                if(result.InvitedUsers != null)
                {
                    link = result.InvitedUsers.First().InvitationLink;
                    int index = link.IndexOf("?");
                    if (index > 0) link = link.Substring(0, index);
                    successfulEmails.Add(email);
                    _logger.LogInformation($"Generated edit link for {site}. The link works for: {string.Join(", ", successfulEmails)}");
                    _logger.LogInformation($"Share link: {link}");
                }
                else
                {
                    _logger.LogWarning($"User {email} did not get an invitation link");
                }
            }
        }

        if(link == "Link not generated")
        {
            return site;
        }

        return link;
    }
//
///为特定用户创建共享链接
/// 
/// 
///指向正在共享的文件夹的完整链接
///文件夹共享到的所有电子邮件的列表
///此用户是否具有查看权限?True=查看,false=查看和编辑
///链接
私有字符串GenerateSpecificLink(ClientContext上下文、字符串站点、列表电子邮件、bool视图)
{
var link=“未生成链接”;
List successfulEmails=新建列表();
//为每个用户创建一个新链接,因为一次只能为一个用户创建一个链接
foreach(电子邮件中的字符串电子邮件)
{
SharingResult=null;
//如果用户具有查看权限
如果(视图)
{
//ShareDocument()函数中的sendEmail bool被设置为false,因为如果设置为true,它将自动向用户发送一封电子邮件,大多数情况下,该电子邮件都会出现在垃圾邮件文件夹中
//通过将此设置为false,用户可以创建自己的电子邮件,其中包含发送给共享用户的链接,这将具有更高的质量,并且不会出现在垃圾邮件文件夹中
结果=context.Web.ShareDocument(站点,
电子邮件,
ExternalSharingDocumentOption.View,
假,,
“作为测试共享的文件”);
}
//如果用户具有查看和编辑权限
其他的
{
结果=context.Web.ShareDocument(站点,
电子邮件,
ExternalSharingDocumentOption.Edit,
假,,
“作为测试共享的文件”);
}
//如果我们成功共享了文档,请获取链接
//共享链接的格式为“fullurlink?user”,因此我们只需删除“?user”即可获得一个适用于指定的*all*用户的链接
如果(结果!=null)
{
if(result.InvitedUsers!=null)
{
link=result.InvitedUsers.First().InvitationLink;
int index=link.IndexOf(“?”);
如果(索引>0)link=link.Substring(0,索引);
成功的电子邮件。添加(电子邮件);
_logger.LogInformation($”为{site}生成了编辑链接。该链接适用于:{string.Join(“,”,successfulEmails)});
_logger.LogInformation($“共享链接:{link}”);
}
其他的
{
_logger.LogWarning($“用户{email}未获得邀请链接”);
}
}
}
如果(链接==“未生成链接”)
{
返回站点;
}
返回链接;
}
函数来自。理想情况下,我希望继续使用它,但如果可能的话,我希望找到一种方法,强制它将所有用户添加到共享链接,而不是检查他们是否是域的一部分,如果他们是,给他们直接访问(甚至给他们直接访问和共享链接访问)


如果有人对如何使这项工作有任何建议,将不胜感激。如果您需要更多信息,请告诉我。

如果您的租户和网站允许匿名链接,您可以检查
CreateAnonymousLink

ClientResult<string> url = Web.CreateAnonymousLink((ClientRuntimeContext)context, "https://xxx.sharepoint.com/sites/linda/docs_01/folder1", false);
                context.ExecuteQuery();
ClientResult url=Web.CreateAnonymousLink((ClientRuntimeContext)上下文,“https://xxx.sharepoint.com/sites/linda/docs_01/folder1“,假);
context.ExecuteQuery();

我觉得你没有读到我的帖子中提到我不想使用匿名链接的部分:
我不喜欢匿名链接,因为我的应用程序中已经有了一个匿名链接选项。