在C#開發中如何使用Client Object Model客戶端程式碼獲得SharePoint 網站、列表的許可權情況

dosboy發表於2014-06-24

自從人類學會了使用火,烤制的方式替代了人類的消化系統部分功能,從此人類的消化系統更加簡單,加速了人腦的進化;自從SharePoint 2010開始有了Client Side Object Model ,我們就可以不用在伺服器上開發SharePoint解決方案了,開發的方式更加多元化,這又加速了SharePoint 更大範圍的應用。

現在,我們可以在任一臺PC上安裝Visual Studio 然後使用類似於 Object Model的模型來訪問伺服器上的列表、網站或是其它任何東東。

那麼 ,如何使用 Client Side Object Model 客戶端程式碼獲得SharePoint 網站、列表的許可權情況呢,我們需要一臺客戶機先利用VS建一個“控制檯”程式,在這個程式裡,我們要進行如下的步驟:

1. 新建一個“控制檯程式”, 新增Client Side Object Model客戶端的DLL檔案到專案的“引用”當中,

您需要新增如下2個檔案:

Microsoft.SharePoint.Client.dll

Microsoft.SharePoint.Client.Runtime.dll

這2個檔案可以從SharePoint伺服器中找到,方便大家,我提供一下地址(如果是SharePoint 2010,請把15換成14):

C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\ISAPI

因為伺服器是X64的,您老如果使用X86的Win7,也沒有關係照樣可以使用這個64位DLL,但這個專案,一定要保證目標平臺是“Any”。否則會出錯。

 

2. 開啟程式碼檔案,前面新增引用:using Microsoft.SharePoint.Client

然後在 Main 函式,中複製,貼上如下的程式碼到Main 函式中, 

     //如果你想獲得SITE的許可權列表,應該這樣寫
            //string ObjectType = "Site", ObjectTitle = "網站名稱", SiteUrl = "網站的URL";
            string ObjectType = "List", ObjectTitle = "文件", SiteUrl = "http://sp2013";

            ClientContext clientContext = new ClientContext(SiteUrl);
            clientContext.Credentials = new NetworkCredential("administrator", "密碼");
            List selectedList = null;
            Web selectedWeb = null;
            Console.WriteLine("Object:" + ObjectType + " Name:" + ObjectTitle + " URL:" + SiteUrl);
            try
            {
                if (ObjectType != "Site")
                {
                    selectedList = clientContext.Web.Lists.GetByTitle(ObjectTitle);
                    clientContext.Load(selectedList);  
                    
                }
                else
                {
                    selectedWeb = clientContext.Web;                
                    clientContext.Load(selectedWeb);

                }

                clientContext.ExecuteQuery();
            }
            catch (Exception  wex)
            {
                Console.WriteLine(wex.Message);
                Console.ReadLine();
                return;
            }
            RoleAssignmentCollection ras = null;
            if (ObjectType != "Site")
            {
                ras = selectedList.RoleAssignments;
                clientContext.Load(ras);
            }
            else
            {
                ras = selectedWeb.RoleAssignments;
                clientContext.Load(ras);
            }
            
            clientContext.ExecuteQuery();
            Console.WriteLine("It has " + ras.Count + " role assignments");
            foreach (var ra in ras)
            {
                clientContext.Load(ra.RoleDefinitionBindings);
                clientContext.Load(ra.Member);
                clientContext.ExecuteQuery();
                foreach (var definition in ra.RoleDefinitionBindings)
                {
                    clientContext.Load(definition, d => d.Name);
                    clientContext.ExecuteQuery();
                    //C#在輸入中英文混合字元時,對齊會不正常,這個語句主要是給使用者名稱新增空格的
                    string tmpname = ra.Member.Title.Trim() + new string(' ', 30 - Encoding.Default.GetByteCount(ra.Member.Title.Trim()));
                    Console.WriteLine("{0,-20}{1}{2,-15}", ra.Member.PrincipalType.ToString().Trim(), tmpname, definition.Name);
                }
            }
         
            Console.ReadLine();

 

說明:

只要改變一下紅色標記的變數值,這個程式碼就可以獲得任意網站、列表的許可權情況, 如果是網站就把 ObjectType變數寫成Site,如果是列表就把ObjectType寫成是List,其它的不解釋了。

 

示例結果:

 

Client-Side 的原理:

1、初始化Web,

ClientContext(SiteUrl)  ,這個函式可以返回類似於OM中的SPWeb的物件, 並且不需要從SPSite中獲取。

2、必在使用物件的屬性程式碼前,加上如下語句,有了這個語句,系統才會向伺服器提交HTTP查詢,物件的屬性才可以被使用。

clientContext.Load(變數名或是物件,linq表示式);
clientContext.ExecuteQuery();

 

具體可以參考MSDN的相關文章,相信您一定會很快入門:

非常好的PPT:

https://spstc-public.sharepoint.com/Lists/Sessions/Attachments/24/Client-Side%20Object%20Model%20for%20SharePoint%202013%20-%20Bleeker.pdf

非常好的中文入門教材:

http://msdn.microsoft.com/zh-cn/office/fp179912

 

 

相關文章