2017-05-23 1 views
13

Ordner arbeiten:Set Elementberechtigungen

Ich weiß jetzt, wie die Berechtigungen eines Ordners in einer Bibliothek setzen:

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(); 
} 

Datei-Versuch:

I habe versucht, den Dateinamen zu dieser Zeile hinzuzufügen:

var _Item = _List.LoadItemByUrl("/sites/oshirodev/Library1/Folder1/File1.docx");

Hinweis des (/File1.docx) hinzugefügt, um das Ende der Zeile oben.


Fehler erhalten:

Aber das gibt nur einen Fehler:

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: 

Relevante Informationen:

Dies ist eine WinForm-Anwendung auf eine Lauf lokale Maschine, cre mit C# unter Verwendung von .NET 4.0. Sharepoint-Version ist 2010.


Die Frage:

Wie kann ich die Berechtigungen für eine bestimmte Datei ? Wie ich bereits weiß, wie man Berechtigungen für einen bestimmten Ordner setzt.

Antwort

2

Ich gehe davon aus, dass andresm53 Recht ist über Sie die Erweiterung Methode er erwähnt.

Um diese Methode zum Bearbeiten von Dateien zu verwenden, müssen Sie nach FileLeafRef (Dateiname) abfragen und sicherstellen, dass Sie FileLeafRef zur Abfrage ViewFields hinzufügen.

bearbeiten/

Eine weitere sehr wichtige Sache, Grenze für die Dateiabfrage genaue Ordner mit:

query.FolderServerRelativeUrl = System.IO.Path.GetDirectoryName(url).Replace("\\", "/"); 

Arbeits Code unten:

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(); 
} 
+0

Zusätzliche Bounty nur für diese Antwort hinzugefügt, da ich letzte Woche eine Antwort nicht annehmen konnte, da ich unerwartet keinen Zugriff auf einen Computer hatte. Diese Antwort funktioniert gut. Danke für die Hilfe! – oshirowanen

+0

glücklich zu helfen und danke auch! – tinamou

1

Sie laden nichts in Ihrem Kontext. Sie müssen Ihren Kontext mit "Abfragen" laden, um auszuführen, wenn Sie ohne Laden ausführen, tut es nichts. Dies kann einige kleine Änderungen erfordern, aber das Konzept ist korrekt.

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(); 
+0

Ich habe versucht, nur das, aber ich habe immer noch die gleichen Fehler Nachricht, wenn ich 'File1.docx' einschließe. – oshirowanen

+0

hilft das? http://www.morgantechspace.com/2016/04/set-list-item-level-permission-using-csom-c-sharp.html – andresm53

+0

@ andresm53, habe ich diesen Code zuvor versucht, aber ich denke, es ist für eine neuere Version von Sharepoint. Es gibt mir 2 Fehler 'kann Lambda Pxpression nicht konvertieren 'und' enthält keine Definition für SiteUsers'. Ich verwende SharePoint 2010. – oshirowanen

4

ich überprüft die 2010 CSOM documentation, und die Methode, die Sie LoadItemByUrl verwenden existiert nicht. Ist das eine Erweiterung, die du geschrieben hast, vielleicht this one? Wenn ja, dann muss das Problem in dieser Erweiterung sein, wahrscheinlich in der CAML query.

Als Referenz funktionierte dieser 2010 CSOM-Code gegen ein SharePoint 2010-Labor. Beachten Sie, dass es GetItemByID verwendet:

 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(); 
+0

Leider hatte ich letzte Woche aufgrund unvorhergesehener Umstände keinen Zugriff auf einen Computer. Wie gebe ich anstelle einer GetItemById die Datei an? – oshirowanen

0

Versuchen Sie dies.

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; 
     } 
0

Ich denke, Ihr Problem auf den Weg zusammenhängt Sie verwenden:

_Item = _List.LoadItemByUrl("/sites/oshirodev/Library1/Folder1/File1.docx"); 

Versuchen Sie, diese

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();