Совместное использование папки в Sharepoint для внешних и внутренних пользователей через CSOM - PullRequest
0 голосов
/ 03 марта 2020

Для некоторого контекста я сейчас создаю приложение, которое позволит сотрудникам быстро и легко загружать локальные файлы в SharePoint и делиться ими с клиентами, просто выбирая некоторые файлы, вводя некоторые электронные письма клиентов, а затем будет возвращена ссылка. В основном это работает, однако у меня возникла проблема с общим доступом для указанных c пользователей.

  • Если я поделюсь с пользователем, который не является частью моего домена, ему будет предоставлен «общий доступ». ссылка на сайт".
  • Если я делюсь с пользователем, который является частью домена, ему предоставляется «прямой доступ», что делает сгенерированную ссылку для общего доступа непригодной для него
  • Если я делюсь с пользователем, который является внешнему пользователю моего домена, им предоставляется «прямой доступ», что также делает ссылку общего доступа непригодной для них

В случае, если вы не понимаете, что я имею в виду под «ссылкой общего доступа», именно этот раздел на точку обмена:

enter image description here

Мне не нужны анонимные ссылки, так как у меня уже есть возможность для этого в моем приложении, которое работает.

Моя цель - чтобы пользователи добавлялись в ссылку общего доступа независимо от того, кто они, что можно сделать вручную (я могу вручную go добавить в 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;
    }

Функция Web.ShareDocument () происходит из OfficeDevPnP. Core ExternalSharingExtensions . В идеале я хотел бы продолжать использовать это, но если возможно, я хотел бы найти способ заставить его добавить всех пользователей в ссылку общего доступа вместо проверки, являются ли они частью домена, и если они есть, предоставляя им прямой доступ ( или даже дать им обоим прямой доступ и общий доступ к ссылкам).

Если у кого-нибудь есть какие-либо советы о том, как заставить это работать, это было бы очень признательно. Если вам нужна дополнительная информация, просто дайте мне знать.

1 Ответ

0 голосов
/ 04 марта 2020

Вы можете проверить CreateAnonymousLink, если ваш клиент и сайт разрешают анонимную ссылку.

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