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