列出SharePoint Online的所有外部用户

列出SharePoint Online的所有外部用户,sharepoint,sharepoint-2013,sharepoint-online,Sharepoint,Sharepoint 2013,Sharepoint Online,除了powershell(CSOM或JSOM)之外,还有其他方法列出所有外部用户吗? 我想列出所有外部用户及其“权限”。我完成了一个控制台应用程序,该应用程序将导出所有外部用户及其对网站集中所有站点、列表、文件和文件夹的权限 这项工作完成得很快,所以代码修改肯定可以更好地满足您的需求 此解决方案导出包含内容的.csv文件 只需从“Program.class”复制粘贴 使用系统; 使用System.Collections.Generic; 使用System.Linq; 使用系统文本; 使用Syst

除了powershell(CSOM或JSOM)之外,还有其他方法列出所有外部用户吗?
我想列出所有外部用户及其“权限”。

我完成了一个控制台应用程序,该应用程序将导出所有外部用户及其对网站集中所有站点、列表、文件和文件夹的权限

这项工作完成得很快,所以代码修改肯定可以更好地满足您的需求

此解决方案导出包含内容的.csv文件

只需从“Program.class”复制粘贴

使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用系统安全;
使用Microsoft.SharePoint.Client;
Net系统;
名称空间listernaluserscsom
{
班级计划
{
//输出到文件系统
私有静态字符串filePath=@“C:\Users\User\Desktop\output.csv”;
//生成要导出到csv文件的内容
私有静态StringBuilder csv=新StringBuilder();
//所有SiteGrup及其成员的Groupcollection
//为此,只需要一次服务器访问
私有静态组集合组;
静态void Main(字符串[]参数)
{
//网站集url、管理员帐户的用户名和密码
var webUri=新Uri(“https://tenant.sharepoint.com/sites/intranet");
常量字符串用户名=”admin@tenant.com";
const string password=“password”;
var securePassword=new SecureString();
foreach(密码中的var c)
{
securePassword.AppendChar(c);
}
//创建凭据和上下文
var凭据=新的SharePointOnlineCredentials(用户名、安全密码);
var ctx=新的Microsoft.SharePoint.Client.ClientContext(webUri);
证书=证书;
//获取站点集合的rootweb和组
var rootWeb=ctx.Web;
groups=rootWeb.SiteGroups;
//加载groupcollection并立即加载每个组中的某些属性
Load(groups,groups=>groups.Include(g=>g.Title,g=>g.Users,g=>g.Id));
//加载根网站、子网站、列表、相对url、标题、UniqueroAssignments
//包括列表中的UniqueroAssignments和title,让我们不用去服务器了
加载(rootWeb,w=>w.Webs,w=>w.ServerRelativeUrl,w=>w.Title,w=>w.Lists.Include(l=>l.HasUniqueRoleAssignments,l=>l.Title),w=>w.HasUniqueRoleAssignments);
ctx.ExecuteQuery();
//首先,我们只对rootweb执行这些检查,然后递归地检查所有子网站。。。
//如果在web上具有唯一权限,请查找外部用户
if(rootWeb.HasUniqueRoleAssignments)
{
GetExternalUsers和PermissionsWeb(rootWeb);
}
foreach(rootWeb.Lists中的变量列表)
{
if(list.Title!=“MicroFeed”| list.Title!=“Delningslänkar”)
{
ListHasUniqueRoleAssignment(rootWeb、list、ctx);
}
}
foreach(rootWeb.Webs中的var子网)
{
webhasuniquerolesignmentrecursive(子网,ctx);
}
System.IO.File.WriteAllText(文件路径,csv.ToString(),Encoding.UTF8);
}
私有静态void webhasuniquerolesignmentrecursive(Web spWeb,ClientContext ctx)
{
加载(spWeb,w=>w.Webs,w=>w.ServerRelativeUrl,w=>w.Title,w=>w.Lists.Include(l=>l.HasUniqueRoleAssignments,l=>l.Title),w=>w.HasUniqueRoleAssignments);
ctx.ExecuteQuery();
if(spWeb.HasUniqueRoleAssignments)
{
GetExternalUsers和PermissionsWeb(spWeb);
}
foreach(spWeb.Lists中的var列表)
{
if(list.Title!=“MicroFeed”| list.Title!=“Delningslänkar”)
{
ListHasUniqueRoleAssignment(spWeb、list、ctx);
}
}
foreach(spWeb.Webs中的var子网)
{
webhasuniquerolesignmentrecursive(子网,ctx);
}
}
私有静态void ListHasUniqueRoleAssignment(Web spWeb、列表列表、ClientContext ctx)
{
var listsFolders=新列表();
var listsFiles=新列表();
var listsItems=新列表();
CamlQuery=CamlQuery.CreateAllItemsQuery();
ListItemCollection items=list.GetItems(查询);
Load(items,icol=>icol.Include(i=>i.FileSystemObjectType,i=>i.HasUniqueRoleAssignments,i=>i.File,i=>i.Folder,i=>i.File.ListItemAllFields.HasUniqueRoleAssignments,i=>i.Folder.ListItemAllFields.HasUniqueRoleAssignments));
ctx.ExecuteQuery();
listsItems.AddRange(项目);
if(list.HasUniqueRoleAssignments)
{
GetExternalUsers和PermissionsList(spWeb,列表);
}
foreach(listsItems中的var listItem)
{
if(listItem.FileSystemObjectType==FileSystemObjectType.File&&listItem.HasUniqueRoleAssignments)
{
添加(listItem.File);
}
else if(listItem.FileSystemObjectType==FileSystemObjectType.Folder&&listItem.HasUniqueRoleAssignments)
{
添加(listItem.Folder);
}
}
foreach(列表文件中的文件)
{
if(file.ListItemAllFields.HasUniqueRoleAssignments)
{
getExternalUsersAndPermissionsFile(spWeb,文件);
}
}
foreach(列表文件夹中的文件夹)
{
如果(fo
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Security;
using Microsoft.SharePoint.Client;
using System.Net;


namespace ListExternalUsersCSOM
{


    class Program
    {
        // Output to filesystem
        private static string filePath = @"C:\Users\User\Desktop\output.csv";
        // Builds the content to export to the csv file
        private static StringBuilder csv = new StringBuilder();
        // Groupcollection of all sitegrups and their members
        // Only want one trip to the server for this
        private static GroupCollection groups;
        static void Main(string[] args)
        {
            // Sitecollection url, username and password of admin account
            var webUri = new Uri("https://tenant.sharepoint.com/sites/intranet");
            const string userName = "admin@tenant.com";
            const string password = "Password";
            var securePassword = new SecureString();
            foreach (var c in password)
            {
                securePassword.AppendChar(c);
            }
            // Create credentials and context
            var credentials = new SharePointOnlineCredentials(userName, securePassword);
            var ctx = new Microsoft.SharePoint.Client.ClientContext(webUri);
            ctx.Credentials = credentials;

            // Get rootweb and the groups for the sitecollection
            var rootWeb = ctx.Web;
            groups = rootWeb.SiteGroups;
            // Load groupcollection and load certain properties in every group right away
            ctx.Load(groups, groups => groups.Include(g => g.Title, g => g.Users, g => g.Id));
            // Load rootweb, subsites, lists, relative url, title, uniqueroleassingments
            // Inlcude uniqueroleassingments and title in lists, spares us a trip to the server
            ctx.Load(rootWeb, w => w.Webs, w => w.ServerRelativeUrl, w => w.Title, w => w.Lists.Include(l => l.HasUniqueRoleAssignments, l => l.Title), w => w.HasUniqueRoleAssignments);
            ctx.ExecuteQuery();

            // First we do these checks for rootweb only, then we recursively check all subsites...
            // If uniquepermissions on web, look for external users
            if (rootWeb.HasUniqueRoleAssignments)
            {
                getExternalUsersAndPermissionsWeb(rootWeb);
            }


            foreach (var list in rootWeb.Lists)
            {
                if (list.Title != "MicroFeed" | list.Title != "Delningslänkar")
                {
                    ListHasUniqueRoleAssignment(rootWeb, list, ctx);
                }

            }

            foreach (var subWeb in rootWeb.Webs)
            {
                WebHasUniqueRoleAssignmentRecursive(subWeb, ctx);
            }

            System.IO.File.WriteAllText(filePath, csv.ToString(), Encoding.UTF8);


        }

        private static void WebHasUniqueRoleAssignmentRecursive(Web spWeb, ClientContext ctx)
        {
            ctx.Load(spWeb, w => w.Webs, w => w.ServerRelativeUrl, w => w.Title, w => w.Lists.Include(l => l.HasUniqueRoleAssignments, l => l.Title), w => w.HasUniqueRoleAssignments);
            ctx.ExecuteQuery();

            if (spWeb.HasUniqueRoleAssignments)
            {
                getExternalUsersAndPermissionsWeb(spWeb);
            }
            foreach (var list in spWeb.Lists)
            {
                if (list.Title != "MicroFeed" | list.Title != "Delningslänkar")
                {
                    ListHasUniqueRoleAssignment(spWeb, list, ctx);
                }

            }

            foreach (var subWeb in spWeb.Webs)
            {
                WebHasUniqueRoleAssignmentRecursive(subWeb, ctx);
            }


        }

        private static void ListHasUniqueRoleAssignment(Web spWeb, List list, ClientContext ctx)
        {
            var listsFolders = new List<Folder>();
            var listsFiles = new List<File>();
            var listsItems = new List<ListItem>();

            CamlQuery query = CamlQuery.CreateAllItemsQuery();
            ListItemCollection items = list.GetItems(query);
            ctx.Load(items, icol => icol.Include(i => i.FileSystemObjectType, i => i.HasUniqueRoleAssignments, i => i.File, i => i.Folder, i => i.File.ListItemAllFields.HasUniqueRoleAssignments, i => i.Folder.ListItemAllFields.HasUniqueRoleAssignments));
            ctx.ExecuteQuery();
            listsItems.AddRange(items);

            if (list.HasUniqueRoleAssignments)
            {
                getExternalUsersAndPermissionsList(spWeb, list);

            }

            foreach (var listItem in listsItems)
            {
                if (listItem.FileSystemObjectType == FileSystemObjectType.File && listItem.HasUniqueRoleAssignments)
                {
                    listsFiles.Add(listItem.File);
                }
                else if (listItem.FileSystemObjectType == FileSystemObjectType.Folder && listItem.HasUniqueRoleAssignments)
                {
                    listsFolders.Add(listItem.Folder);
                }
            }

            foreach (File file in listsFiles)
            {

                if (file.ListItemAllFields.HasUniqueRoleAssignments)
                {
                    getExternalUsersAndPermissionsFile(spWeb, file);
                }
            }

            foreach (Folder folder in listsFolders)
            {

                if (folder.ListItemAllFields.HasUniqueRoleAssignments)
                {
                    getExternalUsersAndPermissionsFolder(spWeb, folder);
                }
            }


        }

        private static void getExternalUsersAndPermissionsWeb(Web spWeb)
        {
            var ctx = spWeb.Context;
            var assignments = spWeb.RoleAssignments;

            // Load roleassingment for web, include users and groups and their permissionslevels on this web
            ctx.Load(assignments, assignment => assignment.Include(role => role.Member, role => role.RoleDefinitionBindings));
            ctx.ExecuteQuery();

            // Iterate trough all assingments
            foreach (var roleAssingment in assignments)
            {
                // If a user loginname contains #ext# it is an external user, so print the user and the permission level
                if (roleAssingment.Member.LoginName.ToString().Contains("#ext") & roleAssingment.Member.PrincipalType.Equals(Microsoft.SharePoint.Client.Utilities.PrincipalType.User))
                {
                    var output = String.Format("Site \"{0}\": {1} har rättighet {2} ", spWeb.Title, roleAssingment.Member.Title, roleAssingment.RoleDefinitionBindings.First().Name);
                    Console.WriteLine(output);
                    csv.AppendLine(output);

                }
                // If a group
                else if (roleAssingment.Member.PrincipalType.Equals(Microsoft.SharePoint.Client.Utilities.PrincipalType.SharePointGroup))
                {
                    // Go to groupcollection we got earlier, get the corresonding groups users
                    var users = groups.Where(g => g.Title == roleAssingment.Member.Title).First().Users;

                    // Iterate trough users
                    foreach (var user in users)
                    {
                        // If a user loginname contains #ext# it is an external user, so print the user and the permission level

                        if (user.LoginName.ToString().Contains("#ext#"))
                        {
                            var output2 = String.Format("Site \"{0}\": {1} har rättighet {2} ", spWeb.Title, roleAssingment.Member.Title, roleAssingment.RoleDefinitionBindings.First().Name);
                            Console.WriteLine(output2);
                            csv.AppendLine(output2);


                        }
                    }

                }

            }

        }
        private static void getExternalUsersAndPermissionsList(Web spWeb, List list)
        {

            var ctx = spWeb.Context;
            var assignments = list.RoleAssignments;
            ctx.Load(assignments, assignment => assignment.Include(role => role.Member, role => role.RoleDefinitionBindings));
            ctx.ExecuteQuery();


            foreach (var roleAssingment in assignments)
            {
                if (roleAssingment.Member.LoginName.ToString().Contains("#ext") & roleAssingment.Member.PrincipalType.Equals(Microsoft.SharePoint.Client.Utilities.PrincipalType.User))
                {
                    var output = String.Format("Lista \"{0}\": {1} har rättighet {2} ", list.Title, roleAssingment.Member.Title, roleAssingment.RoleDefinitionBindings.First().Name);
                    Console.WriteLine(output);
                    csv.AppendLine(output);

                }
                else if (roleAssingment.Member.PrincipalType.Equals(Microsoft.SharePoint.Client.Utilities.PrincipalType.SharePointGroup))
                {
                    var users = groups.Where(g => g.Title == roleAssingment.Member.Title).First().Users;

                    foreach (var user in users)
                    {
                        if (user.LoginName.ToString().Contains("#ext#"))
                        {
                            var output2 = String.Format("Lista \"{0}\": {1} har rättighet {2} ", list.Title, roleAssingment.Member.Title, roleAssingment.RoleDefinitionBindings.First().Name);
                            Console.WriteLine(output2);
                            csv.AppendLine(output2);


                        }
                    }

                }

            }

        }


        private static void getExternalUsersAndPermissionsFile(Web spWeb, File item)
        {
            var ctx = spWeb.Context;
            var assignments = item.ListItemAllFields.RoleAssignments;
            ctx.Load(assignments, assignment => assignment.Include(role => role.Member, role => role.RoleDefinitionBindings));
            ctx.ExecuteQuery();


            foreach (var roleAssingment in assignments)
            {
                if (roleAssingment.Member.LoginName.ToString().Contains("#ext") & roleAssingment.Member.PrincipalType.Equals(Microsoft.SharePoint.Client.Utilities.PrincipalType.User))
                {
                    var output = String.Format("Fil \"{0}\": {1} har rättighet {2} ", item.Name, roleAssingment.Member.Title, roleAssingment.RoleDefinitionBindings.First().Name);
                    Console.WriteLine(output);
                    csv.AppendLine(output);

                }
                else if (roleAssingment.Member.PrincipalType.Equals(Microsoft.SharePoint.Client.Utilities.PrincipalType.SharePointGroup))
                {
                    var users = groups.Where(g => g.Title == roleAssingment.Member.Title).First().Users;

                    foreach (var user in users)
                    {
                        if (user.LoginName.ToString().Contains("#ext#"))
                        {
                            var output2 = String.Format("Fil \"{0}\": {1} har rättighet {2} ", item.Name, roleAssingment.Member.Title, roleAssingment.RoleDefinitionBindings.First().Name);
                            Console.WriteLine(output2);
                            csv.AppendLine(output2);


                        }
                    }

                }

            }

        }

        private static void getExternalUsersAndPermissionsFolder(Web spWeb, Folder folder)
        {
            var ctx = spWeb.Context;
            var assignments = folder.ListItemAllFields.RoleAssignments;
            ctx.Load(assignments, assignment => assignment.Include(role => role.Member, role => role.RoleDefinitionBindings));
            ctx.ExecuteQuery();


            foreach (var roleAssingment in assignments)
            {
                if (roleAssingment.Member.LoginName.ToString().Contains("#ext") & roleAssingment.Member.PrincipalType.Equals(Microsoft.SharePoint.Client.Utilities.PrincipalType.User))
                {
                    var output = String.Format("Mapp\\Dokumentgrupp \"{0}\": {1} har rättighet {2} ", folder.Name, roleAssingment.Member.Title, roleAssingment.RoleDefinitionBindings.First().Name);
                    Console.WriteLine(output);
                    csv.AppendLine(output);

                }
                else if (roleAssingment.Member.PrincipalType.Equals(Microsoft.SharePoint.Client.Utilities.PrincipalType.SharePointGroup))
                {
                    var users = groups.Where(g => g.Title == roleAssingment.Member.Title).First().Users;

                    foreach (var user in users)
                    {
                        if (user.LoginName.ToString().Contains("#ext#"))
                        {
                            var output2 = String.Format("Mapp\\Dokumentgrupp \"{0}\": {1} har rättighet {2} ", folder.Name, roleAssingment.Member.Title, roleAssingment.RoleDefinitionBindings.First().Name);

                            Console.WriteLine(output2);
                            csv.AppendLine(output2);

                        }
                    }

                }

            }

        }



    }
}