Listing the permissions of every document in a document library

Here is a code sample I wrote to list every user/group who has permissions on each document in a document library in Office 365 using CSOM

 using System;
using System.Net;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.SharePoint.Client;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string siteUrl = "https://<your sharepoint site URL>/";

ClientContext clientContext = new ClientContext(siteUrl);
System.Security.SecureString password = new System.Security.SecureString();
password.InsertAt(0, 'p');
password.InsertAt(1, 'a');
password.InsertAt(2, 's');
password.InsertAt(3, 's');
password.InsertAt(4, '@');
password.InsertAt(5, 'w');
password.InsertAt(6, 'o');
password.InsertAt(7, 'r');
password.InsertAt(8, 'd');
password.InsertAt(9, '1');

clientContext.Credentials = new SharePointOnlineCredentials("your office 365 UPN", password);

Web site = clientContext.Web;
List targetList = site.Lists.GetByTitle("Documents");

clientContext.Load(site);
clientContext.Load(targetList);
clientContext.ExecuteQuery();
ListItem li = null;
RoleAssignmentCollection rac;
for (int x = 1; x <= targetList.ItemCount; x++)
{

clientContext.Load(targetList);
clientContext.ExecuteQuery();

li = targetList.GetItemById(x);
clientContext.Load(li.File);
clientContext.ExecuteQuery();

Console.WriteLine(li.File.Name);

rac = targetList.GetItemById(x).RoleAssignments;

clientContext.Load(rac);
clientContext.ExecuteQuery();
RoleAssignment ra = null;
if (rac.AreItemsAvailable)
{
for (int i = 0; i < rac.Count; i++)
{
ra = rac.ElementAt(i);

clientContext.Load(ra.Member);
clientContext.ExecuteQuery();

Console.WriteLine(ra.Member.LoginName);
}
}

Console.WriteLine('\n');
}
}
}
}

 

ConsoleApplication1.zip