设置项目权限
Set Item Permissions
文件夹工作:
我现在知道如何设置库中文件夹的权限了:
public void ChangeItemPermissions()
{
_SharePoint.ClientContext _ClientContext = new _SharePoint.ClientContext("https://sharepoint.oshirowanen.com/sites/oshirodev/");
_ClientContext.Credentials = new NetworkCredential("user", "pass", "oshirowanen.com");
_SharePoint.Principal user = _ClientContext.Web.EnsureUser(@"oshirowanen\tom");
var _List = _ClientContext.Web.Lists.GetByTitle("Library1");
var _Item = _List.LoadItemByUrl("/sites/oshirodev/Library1/Folder1");
var roleDefinition = _ClientContext.Site.RootWeb.RoleDefinitions.GetByType(_SharePoint.RoleType.Reader);
var roleBindings = new _SharePoint.RoleDefinitionBindingCollection(_ClientContext) { roleDefinition };
_Item.BreakRoleInheritance(false,true);
_Item.RoleAssignments.Add(user, roleBindings);
_ClientContext.ExecuteQuery();
}
文件尝试:
我试过将文件名添加到这一行:
var _Item = _List.LoadItemByUrl("/sites/oshirodev/Library1/Folder1/File1.docx");
注意添加到上一行末尾的 (/File1.docx)。
收到错误:
但这只是给出了一个错误:
System.NullReferenceException was unhandled
HResult=-2147467261
Message=Object reference not set to an instance of an object.
Source=ItemPermissions
StackTrace:
at ItemPermissions.Form1.ChangeItemPermissions() in c:\Users\Oshirowanen\Documents\Visual Studio 2013\Projects\ItemPermissions\ItemPermissions\Form1.cs:line 46
at ItemPermissions.Form1.button1_Click(Object sender, EventArgs e) in c:\Users\Oshirowanen\Documents\Visual Studio 2013\Projects\ItemPermissions\ItemPermissions\Form1.cs:line 345
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.Run(Form mainForm)
at ItemPermissions.Program.Main() in c:\Users\Oshirowanen\Documents\Visual Studio 2013\Projects\ItemPermissions\ItemPermissions\Program.cs:line 18
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:
相关信息:
这是本地计算机上的 WinForm 应用程序 运行,使用 C# 创建,使用 .NET 4.0。 SharePoint 版本是 2010.
问题:
如何设置特定 文件 的权限?我已经知道如何为特定的 文件夹.
设置权限
您没有在上下文中加载任何内容。您需要使用 "queries" 加载您的上下文才能执行,如果您在没有加载的情况下执行,它不会执行任何操作。这可能需要一些细微的改动,但概念是正确的。
var _List = _ClientContext.Web.Lists.GetByTitle("Library1");
var _Item = _List.LoadItemByUrl("/sites/oshirodev/Library1/Folder1");
_ClientContext.Load(_Item);
_ClientContenxt.ExecuteQuery();
var roleDefinition = _ClientContext.Site.RootWeb.RoleDefinitions.GetByType(_SharePoint.RoleType.Reader);
_ClientContext.Load(roleDefinition);
_ClientContenxt.ExecuteQuery();
var roleBindings = new _SharePoint.RoleDefinitionBindingCollection(_ClientContext) { roleDefinition };
_Item.BreakRoleInheritance(false,true);
_Item.RoleAssignments.Add(user, roleBindings);
_ClientContext.Load(_Item);
_ClientContext.ExecuteQuery();
我查看了2010 CSOM documentation, and the method you are using LoadItemByUrl doesn't exist. Is that an extension you wrote, perhaps ? If so then the problem must be in that extension, probably in the CAML query。
作为参考,此 2010 CSOM 代码在 SharePoint 2010 实验室中运行良好。请注意,它使用 GetItemByID:
ClientContext _ClientContext = new ClientContext("http://team/sites/Team1/");
_ClientContext.Credentials = new NetworkCredential("administrator", "*****", "corp");
Principal user = _ClientContext.Web.EnsureUser(@"corp\administrator");
var _List = _ClientContext.Web.Lists.GetByTitle("Shared Documents");
var _Item = _List.GetItemById(23);
var roleDefinition = _ClientContext.Site.RootWeb.RoleDefinitions.GetByType(RoleType.Reader);
var roleBindings = new RoleDefinitionBindingCollection(_ClientContext) { roleDefinition };
_Item.BreakRoleInheritance(false, true);
_Item.RoleAssignments.Add(user, roleBindings);
_ClientContext.ExecuteQuery();
我认为 andresm53
关于您使用他提到的扩展方法的说法是正确的。
要使此方法适用于需要按 FileLeafRef
(文件名)查询的文件,并确保将 FileLeafRef
添加到查询 ViewFields
.
/编辑
还有一件非常重要的事情,将文件查询限制为确切的文件夹:
query.FolderServerRelativeUrl = System.IO.Path.GetDirectoryName(url).Replace("\", "/");
下面的工作代码:
void Main()
{
ClientContext context = new ClientContext("https://sharepoint.oshirowanen.com/sites/oshirodev/");
context.Credentials = new NetworkCredential("user", "pass", "oshirowanen.com");
Principal user = context.Web.EnsureUser(@"oshirowanen\tom");
ChangeItemPermissions(context, "/sites/oshirodev/Library1/Folder1/File1.docx", "Library1", user, RoleType.Reader);
}
// Define other methods and classes here
public static ListItem LoadItemByUrl(List list, string url)
{
var context = list.Context;
string ext = System.IO.Path.GetExtension(url);
var query = new CamlQuery();
if (string.IsNullOrEmpty(ext))
query.ViewXml = String.Format("<View><RowLimit>1</RowLimit><Query><Where><Eq><FieldRef Name='FileRef'/><Value> Type='Url'>{0}</Value></Eq></Where></Query></View>", url);
else
{
query.ViewXml = String.Format("<View><ViewFields><FieldRef Name=\"FileLeafRef\" /></ViewFields><Query><Where><Eq><FieldRef Name=\"FileLeafRef\" /><Value Type=\"Text\">{0}</Value></Eq></Where></Query><RowLimit>1</RowLimit></View>", System.IO.Path.GetFileName(url));
query.FolderServerRelativeUrl = System.IO.Path.GetDirectoryName(url).Replace("\", "/");
}
var items = list.GetItems(query);
context.Load(items);
context.ExecuteQuery();
return items.Count > 0 ? items[0] : null;
}
public void ChangeItemPermissions(ClientContext context, string url, string listName, Principal user, RoleType type)
{
var list = context.Web.Lists.GetByTitle(listName);
var item = LoadItemByUrl(list, url);
var roleDefinition = context.Site.RootWeb.RoleDefinitions.GetByType(type);
var roleBindings = new RoleDefinitionBindingCollection(context) { roleDefinition };
item.BreakRoleInheritance(false, true);
item.RoleAssignments.Add(user, roleBindings);
context.ExecuteQuery();
}
试试这个。
static void Main()
{
string siteUrl = "Your site url";
ClientContext clientContext = new ClientContext(siteUrl);
var list = clientContext.Web.Lists.GetByTitle("JZhu");
var items = list.GetItems(CamlQuery.CreateAllItemsQuery());
clientContext.Load(items);
clientContext.ExecuteQuery();
clientContext.Load(clientContext.Web.SiteGroups);
clientContext.ExecuteQuery();
GroupCollection oSiteCollectionGroups= clientContext.Web.SiteGroups;
foreach (Group grp in oSiteCollectionGroups)
{
Console.WriteLine(grp.Title);
if (grp.Title == "My group")
{
oGroup=gpr;
break;
}
}
foreach (var item in items)
{
var folder = GetListItemFolder(item); //get Folder
Console.WriteLine(folder.Name);
if (folder.Name=="Folder 1" || folder.Name=="Folder 2")
{
item.BreakRoleInheritance(false);
RoleDefinitionBindingCollection collRoleDefinitionBinding = new RoleDefinitionBindingCollection(clientContext);
//set role type
collRoleDefinitionBinding.Add(clientContext.Web.RoleDefinitions.GetByType(RoleType.Reader));
//oGroup - your group
item.RoleAssignments.Add(oGroup, collRoleDefinitionBinding);
clientContext.ExecuteQuery();
}
}
}
private static Folder GetListItemFolder(ListItem listItem)
{
var folderUrl = (string)listItem["FileDirRef"];
var parentFolder = listItem.ParentList.ParentWeb.GetFolderByServerRelativeUrl(folderUrl);
listItem.Context.Load(parentFolder);
listItem.Context.ExecuteQuery();
return parentFolder;
}
我猜你的问题与你使用的路径有关:
_Item = _List.LoadItemByUrl("/sites/oshirodev/Library1/Folder1/File1.docx");
试试这个
Uri filename = new Uri(@"http://server//oshirodev/Library1/Folder1/File1.docx");
string server = filename.AbsoluteUri.Replace(filename.AbsolutePath, "");
Microsoft.SharePoint.Client.ClientContext clientContext = new Microsoft.SharePoint.Client.ClientContext(server);
_ClientContext.Credentials = new NetworkCredential("user", "pass", "oshirowanen.com");
_SharePoint.Principal user = _ClientContext.Web.EnsureUser(@"oshirowanen\tom");
var roleDefinition = _ClientContext.Site.RootWeb.RoleDefinitions.GetByType(_SharePoint.RoleType.Reader);
var roleBindings = new _SharePoint.RoleDefinitionBindingCollection(_ClientContext) { roleDefinition };
_Item.BreakRoleInheritance(false,true);
_Item.RoleAssignments.Add(user, roleBindings);
_ClientContext.ExecuteQuery();
文件夹工作:
我现在知道如何设置库中文件夹的权限了:
public void ChangeItemPermissions()
{
_SharePoint.ClientContext _ClientContext = new _SharePoint.ClientContext("https://sharepoint.oshirowanen.com/sites/oshirodev/");
_ClientContext.Credentials = new NetworkCredential("user", "pass", "oshirowanen.com");
_SharePoint.Principal user = _ClientContext.Web.EnsureUser(@"oshirowanen\tom");
var _List = _ClientContext.Web.Lists.GetByTitle("Library1");
var _Item = _List.LoadItemByUrl("/sites/oshirodev/Library1/Folder1");
var roleDefinition = _ClientContext.Site.RootWeb.RoleDefinitions.GetByType(_SharePoint.RoleType.Reader);
var roleBindings = new _SharePoint.RoleDefinitionBindingCollection(_ClientContext) { roleDefinition };
_Item.BreakRoleInheritance(false,true);
_Item.RoleAssignments.Add(user, roleBindings);
_ClientContext.ExecuteQuery();
}
文件尝试:
我试过将文件名添加到这一行:
var _Item = _List.LoadItemByUrl("/sites/oshirodev/Library1/Folder1/File1.docx");
注意添加到上一行末尾的 (/File1.docx)。
收到错误:
但这只是给出了一个错误:
System.NullReferenceException was unhandled
HResult=-2147467261
Message=Object reference not set to an instance of an object.
Source=ItemPermissions
StackTrace:
at ItemPermissions.Form1.ChangeItemPermissions() in c:\Users\Oshirowanen\Documents\Visual Studio 2013\Projects\ItemPermissions\ItemPermissions\Form1.cs:line 46
at ItemPermissions.Form1.button1_Click(Object sender, EventArgs e) in c:\Users\Oshirowanen\Documents\Visual Studio 2013\Projects\ItemPermissions\ItemPermissions\Form1.cs:line 345
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.Run(Form mainForm)
at ItemPermissions.Program.Main() in c:\Users\Oshirowanen\Documents\Visual Studio 2013\Projects\ItemPermissions\ItemPermissions\Program.cs:line 18
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:
相关信息:
这是本地计算机上的 WinForm 应用程序 运行,使用 C# 创建,使用 .NET 4.0。 SharePoint 版本是 2010.
问题:
如何设置特定 文件 的权限?我已经知道如何为特定的 文件夹.
设置权限您没有在上下文中加载任何内容。您需要使用 "queries" 加载您的上下文才能执行,如果您在没有加载的情况下执行,它不会执行任何操作。这可能需要一些细微的改动,但概念是正确的。
var _List = _ClientContext.Web.Lists.GetByTitle("Library1");
var _Item = _List.LoadItemByUrl("/sites/oshirodev/Library1/Folder1");
_ClientContext.Load(_Item);
_ClientContenxt.ExecuteQuery();
var roleDefinition = _ClientContext.Site.RootWeb.RoleDefinitions.GetByType(_SharePoint.RoleType.Reader);
_ClientContext.Load(roleDefinition);
_ClientContenxt.ExecuteQuery();
var roleBindings = new _SharePoint.RoleDefinitionBindingCollection(_ClientContext) { roleDefinition };
_Item.BreakRoleInheritance(false,true);
_Item.RoleAssignments.Add(user, roleBindings);
_ClientContext.Load(_Item);
_ClientContext.ExecuteQuery();
我查看了2010 CSOM documentation, and the method you are using LoadItemByUrl doesn't exist. Is that an extension you wrote, perhaps
作为参考,此 2010 CSOM 代码在 SharePoint 2010 实验室中运行良好。请注意,它使用 GetItemByID:
ClientContext _ClientContext = new ClientContext("http://team/sites/Team1/");
_ClientContext.Credentials = new NetworkCredential("administrator", "*****", "corp");
Principal user = _ClientContext.Web.EnsureUser(@"corp\administrator");
var _List = _ClientContext.Web.Lists.GetByTitle("Shared Documents");
var _Item = _List.GetItemById(23);
var roleDefinition = _ClientContext.Site.RootWeb.RoleDefinitions.GetByType(RoleType.Reader);
var roleBindings = new RoleDefinitionBindingCollection(_ClientContext) { roleDefinition };
_Item.BreakRoleInheritance(false, true);
_Item.RoleAssignments.Add(user, roleBindings);
_ClientContext.ExecuteQuery();
我认为 andresm53
关于您使用他提到的扩展方法的说法是正确的。
要使此方法适用于需要按 FileLeafRef
(文件名)查询的文件,并确保将 FileLeafRef
添加到查询 ViewFields
.
/编辑
还有一件非常重要的事情,将文件查询限制为确切的文件夹:
query.FolderServerRelativeUrl = System.IO.Path.GetDirectoryName(url).Replace("\", "/");
下面的工作代码:
void Main()
{
ClientContext context = new ClientContext("https://sharepoint.oshirowanen.com/sites/oshirodev/");
context.Credentials = new NetworkCredential("user", "pass", "oshirowanen.com");
Principal user = context.Web.EnsureUser(@"oshirowanen\tom");
ChangeItemPermissions(context, "/sites/oshirodev/Library1/Folder1/File1.docx", "Library1", user, RoleType.Reader);
}
// Define other methods and classes here
public static ListItem LoadItemByUrl(List list, string url)
{
var context = list.Context;
string ext = System.IO.Path.GetExtension(url);
var query = new CamlQuery();
if (string.IsNullOrEmpty(ext))
query.ViewXml = String.Format("<View><RowLimit>1</RowLimit><Query><Where><Eq><FieldRef Name='FileRef'/><Value> Type='Url'>{0}</Value></Eq></Where></Query></View>", url);
else
{
query.ViewXml = String.Format("<View><ViewFields><FieldRef Name=\"FileLeafRef\" /></ViewFields><Query><Where><Eq><FieldRef Name=\"FileLeafRef\" /><Value Type=\"Text\">{0}</Value></Eq></Where></Query><RowLimit>1</RowLimit></View>", System.IO.Path.GetFileName(url));
query.FolderServerRelativeUrl = System.IO.Path.GetDirectoryName(url).Replace("\", "/");
}
var items = list.GetItems(query);
context.Load(items);
context.ExecuteQuery();
return items.Count > 0 ? items[0] : null;
}
public void ChangeItemPermissions(ClientContext context, string url, string listName, Principal user, RoleType type)
{
var list = context.Web.Lists.GetByTitle(listName);
var item = LoadItemByUrl(list, url);
var roleDefinition = context.Site.RootWeb.RoleDefinitions.GetByType(type);
var roleBindings = new RoleDefinitionBindingCollection(context) { roleDefinition };
item.BreakRoleInheritance(false, true);
item.RoleAssignments.Add(user, roleBindings);
context.ExecuteQuery();
}
试试这个。
static void Main()
{
string siteUrl = "Your site url";
ClientContext clientContext = new ClientContext(siteUrl);
var list = clientContext.Web.Lists.GetByTitle("JZhu");
var items = list.GetItems(CamlQuery.CreateAllItemsQuery());
clientContext.Load(items);
clientContext.ExecuteQuery();
clientContext.Load(clientContext.Web.SiteGroups);
clientContext.ExecuteQuery();
GroupCollection oSiteCollectionGroups= clientContext.Web.SiteGroups;
foreach (Group grp in oSiteCollectionGroups)
{
Console.WriteLine(grp.Title);
if (grp.Title == "My group")
{
oGroup=gpr;
break;
}
}
foreach (var item in items)
{
var folder = GetListItemFolder(item); //get Folder
Console.WriteLine(folder.Name);
if (folder.Name=="Folder 1" || folder.Name=="Folder 2")
{
item.BreakRoleInheritance(false);
RoleDefinitionBindingCollection collRoleDefinitionBinding = new RoleDefinitionBindingCollection(clientContext);
//set role type
collRoleDefinitionBinding.Add(clientContext.Web.RoleDefinitions.GetByType(RoleType.Reader));
//oGroup - your group
item.RoleAssignments.Add(oGroup, collRoleDefinitionBinding);
clientContext.ExecuteQuery();
}
}
}
private static Folder GetListItemFolder(ListItem listItem)
{
var folderUrl = (string)listItem["FileDirRef"];
var parentFolder = listItem.ParentList.ParentWeb.GetFolderByServerRelativeUrl(folderUrl);
listItem.Context.Load(parentFolder);
listItem.Context.ExecuteQuery();
return parentFolder;
}
我猜你的问题与你使用的路径有关:
_Item = _List.LoadItemByUrl("/sites/oshirodev/Library1/Folder1/File1.docx");
试试这个
Uri filename = new Uri(@"http://server//oshirodev/Library1/Folder1/File1.docx");
string server = filename.AbsoluteUri.Replace(filename.AbsolutePath, "");
Microsoft.SharePoint.Client.ClientContext clientContext = new Microsoft.SharePoint.Client.ClientContext(server);
_ClientContext.Credentials = new NetworkCredential("user", "pass", "oshirowanen.com");
_SharePoint.Principal user = _ClientContext.Web.EnsureUser(@"oshirowanen\tom");
var roleDefinition = _ClientContext.Site.RootWeb.RoleDefinitions.GetByType(_SharePoint.RoleType.Reader);
var roleBindings = new _SharePoint.RoleDefinitionBindingCollection(_ClientContext) { roleDefinition };
_Item.BreakRoleInheritance(false,true);
_Item.RoleAssignments.Add(user, roleBindings);
_ClientContext.ExecuteQuery();