在CSOM的Sharepoint中创建文件夹并与没有Microsoft帐户的来宾用户共享

时间:2019-02-28 07:57:49

标签: sharepoint csom

我在CSOM / Sharepoint开发中是一个新手,有一个有趣的任务要解决。不幸的是,在某些细节上我没有取得多少进展。 我的客户想要一种安全的方式来交换机密文件。因此,我的想法是在Sharepoint中为每个客户创建一个文件夹,并将其作为来宾用户与客户共享。因此,客户可以访问“他的”文档文件夹,并可以在那里上传和下载文档。我也可以手动执行此操作,但是我想通过CSOM以编程方式解决此问题。

到目前为止,我已经以编程方式创建了该文件夹。而且文件上传没有问题。 但是,释放客户的文件夹是有问题的。我设法共享了该文件夹,以便客户可以使用他的Microsoft帐户登录或“针对所有人”下达订单。

我需要的是不强制MS帐户的个人发行版。带有验证码等的个人链接...

到目前为止,这是我的代码。

public static void CreateAndShareFolder(ClientContext context, string folderName, string userEmail)
    {
        var listTitle = "Dokumente";
        var rootFolder = "Testfolder_ROOT/";

        var folder = CreateFolder(context.Web, listTitle, rootFolder + folderName);

        var users = new List<UserRoleAssignment>();
        users.Add(new UserRoleAssignment()
        {
            UserId = userEmail,
            Role = Role.Edit,
        });

        var serverRelativeUrl = folder.ServerRelativeUrl;
        var absoluteUrl = new Uri(context.Url).GetLeftPart(UriPartial.Authority) + serverRelativeUrl;

        /* User gets Email, but with "public" Sharing-Link */
        //var userSharingResults = DocumentSharingManager.UpdateDocumentSharingInfo(context, absoluteUrl, users, true, true, true, null, true, true);
        /* User gets Email, but needs an MS-Account to View */
        var userSharingResults = DocumentSharingManager.UpdateDocumentSharingInfo(context, absoluteUrl, users, false, false, true, null, false, true);

        context.ExecuteQuery();
    }

    // From Stackoverflow: https://stackoverflow.com/a/22010815/3062062
    public static Folder CreateFolder(Web web, string listTitle, string fullFolderUrl)
    {
        if (string.IsNullOrEmpty(fullFolderUrl))
            throw new ArgumentNullException("fullFolderUrl");
        var list = web.Lists.GetByTitle(listTitle);
        return CreateFolderInternal(web, list.RootFolder, fullFolderUrl);
    }

    private static Folder CreateFolderInternal(Web web, Folder parentFolder, string fullFolderUrl)
    {
        var folderUrls = fullFolderUrl.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
        string folderUrl = folderUrls[0];
        var curFolder = parentFolder.Folders.Add(folderUrl);
        web.Context.Load(curFolder);
        web.Context.ExecuteQuery();

        if (folderUrls.Length > 1)
        {
            var subFolderUrl = string.Join("/", folderUrls, 1, folderUrls.Length - 1);
            return CreateFolderInternal(web, curFolder, subFolderUrl);
        }
        return curFolder;
    }

0 个答案:

没有答案