Is it possible using code to get all the names of the sites in SharePoint? Specifically, is it possible to list all the names of the lists for each site, and list all the users and their access to the lists?
Quick, dirty, only somewhat tested but it oughtta work. Replace the web application URL with your own:
static void ListLists()
{
SPWebApplication webApp = SPWebApplication.Lookup(new Uri("http://mossdev:8060"));
foreach(SPSite site in webApp.Sites)
{
try
{
PrintWebAndListsRecursive(site.RootWeb, 0);
}
finally
{
site.Dispose();
}
}
Console.ReadLine();
}
static void PrintWebAndListsRecursive(SPWeb web, int level)
{
Console.WriteLine("".PadLeft(level * 3) + "Site: {0} ({1})", web.Title, web.Url);
foreach(SPList list in web.Lists)
{
Console.WriteLine("".PadLeft((level + 1) * 3) + "List: {0}", list.Title);
foreach(SPRoleAssignment roleAssignment in list.RoleAssignments)
{
if(roleAssignment.Member is SPGroup)
{
var group = (SPGroup) roleAssignment.Member;
Console.WriteLine("".PadLeft((level + 2) * 3) + "Group: {0}", group.Name);
foreach(SPUser user in group.Users)
{
Console.WriteLine("".PadLeft((level + 4) * 3) + user.Name);
}
}
else
{
Console.WriteLine("".PadLeft((level + 2) *3) + "User: {0}", roleAssignment.Member.Name);
}
foreach(SPRoleDefinition roleDef in roleAssignment.RoleDefinitionBindings)
{
if (!roleDef.Hidden)
{
Console.WriteLine("".PadLeft((level + 3) * 3) + "Role Definition: {0}", roleDef.Name);
}
}
}
}
foreach(SPWeb subWeb in web.Webs)
{
try
{
PrintWebAndListsRecursive(subWeb, level+1);
}
finally
{
subWeb.Dispose();
}
}
}