Below code fetches only site level permissions. Same can me modified to fetch all lists and/or list items and check permissions at that level as well.
SecureString securePassword = new SecureString();
ClientContext context = new ClientContext(txtURL.Text);
string decryptedPwdt = txtPassword.Text;
foreach (char c in decryptedPwdt)
{
securePassword.AppendChar(c);
}
context.Credentials = new NetworkCredential(txtUser.Text, decryptedPwdt, "Domain");
Web web = context.Web;
context.Load(web);
UserCollection userColl = web.SiteUsers;
context.Load(userColl);
var assignments = web.RoleAssignments;
context.Load(assignments, ac => ac.Include(
a => a.RoleDefinitionBindings, a => a.Member.LoginName));
context.ExecuteQuery();
context.RequestTimeout = 9999999;
DataTable dt = new DataTable();
dt.Columns.Add("User");
dt.Columns.Add("Permission");
foreach (User user in userColl)
{
try
{
var permissions = web.GetUserEffectivePermissions(user.LoginName);
context.ExecuteQuery();
if (permissions != null)
{
if (permissions.Value.Has(PermissionKind.ManageWeb))
{
dt.Rows.Add(user.Email, "Full Controll");
}
else if (permissions.Value.Has(PermissionKind.ManageLists))
{
dt.Rows.Add(user.Email, "Edit");
}
else if (permissions.Value.Has(PermissionKind.DeleteListItems))
{
dt.Rows.Add(user.Email, "Contribute");
}
else if (permissions.Value.Has(PermissionKind.ViewListItems))
{
dt.Rows.Add(user.Email, "Read");
}
}
}
catch { }
}
dataGridPermissions.DataSource = dt;
MessageBox.Show("Done!");