SharePointの権限が一覧で欲しい。ということで、サイト、ライブラリ、アイテムで権限の継承を切っているものを出力するコードを書きました。xmlで出力するんですが、Excelで開くように
webXml.AppendChild(webXml.CreateProcessingInstruction("mso-application", "progid=¥"Excel.Sheet¥""));
こんなコードを入れてみた。SPSiteのインスタンスをnewするところで<your hostname>の部分を適宜変更してみれば使えると思います。
using System;
using System.IO;
using System.Collections.Generic;
using System.Text;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Administration;
using System.Xml;
using System.Text.RegularExpressions;
namespace SPPerms
{
class Program
{
static void Main(string[] args)
{
Program inst = new Program();
inst.exec();
}
public void exec()
{
Regex rgx = new Regex("[\\\\|/|&|:|\\*|?|\"|<|>|\\|]");
String regexStr;
SPSite root = new SPSite("<your hostname>");
SPWebApplication webApp = root.WebApplication;
SPSiteCollection sites = webApp.Sites;
foreach( SPSite site in sites ){
SPWebCollection webs = site.AllWebs;
foreach (SPWeb web in webs)
{
XmlDocument webXml = new XmlDocument();
XmlElement tblElem = createSheet(webXml, web.Title);
if (web.HasUniqueRoleAssignments)
{
SPRoleAssignmentCollection webRoles = web.RoleAssignments;
createRow(webRoles, webXml, web.Title, web.Url, tblElem);
regexStr = rgx.Replace("site." + web.Title + web.ID.ToString(), ".");
webXml.Save(regexStr + ".xml");
}
SPListCollection lists = web.Lists;
foreach (SPList list in lists)
{
bool isOutput = false;
XmlDocument listXml = new XmlDocument();
XmlElement listTblElem = createSheet(listXml, web.Title + "." + list.Title);
if (list.HasUniqueRoleAssignments)
{
SPRoleAssignmentCollection listRoles = list.RoleAssignments;
createRow(listRoles, listXml, list.Title, "http://" + site.HostName + list.DefaultViewUrl, listTblElem);
isOutput = true;
}
SPListItemCollection items = list.Items;
foreach (SPListItem item in items)
{
if (!item.HasUniqueRoleAssignments) continue;
SPRoleAssignmentCollection itemRoles = item.RoleAssignments;
createRow(itemRoles, listXml, "" + item.ID, web.Url + "/" + item.Url, listTblElem);
isOutput = true;
}
if (isOutput)
{
regexStr = rgx.Replace("list." + web.Title + "." + list.Title + list.ID.ToString(), ".");
listXml.Save(regexStr + ".xml");
}
}
}
}
}
private void createRow( SPRoleAssignmentCollection roles, XmlDocument xmlDoc, String title, String url, XmlElement tblElem ){
foreach (SPRoleAssignment role in roles)
{
SPRoleDefinitionBindingCollection roleBindings = role.RoleDefinitionBindings;
foreach( SPRoleDefinition roleDef in roleBindings ){
XmlElement rowElem = xmlDoc.CreateElement("Row");
tblElem.AppendChild(rowElem);
rowElem.AppendChild(createCellNode(xmlDoc, title));
rowElem.AppendChild(createCellNode(xmlDoc, url ));
rowElem.AppendChild(createCellNode(xmlDoc, role.Member.Name));
rowElem.AppendChild(createCellNode(xmlDoc, roleDef.Name ));
}
}
}
private XmlElement createSheet( XmlDocument webXml, String sheetName )
{
webXml.AppendChild(webXml.CreateXmlDeclaration("1.0", "UTF-8", null));
webXml.AppendChild(webXml.CreateProcessingInstruction("mso-application", "progid=\"Excel.Sheet\""));
XmlElement wbElem = webXml.CreateElement("Workbook");
wbElem.SetAttribute("xmlns", "urn:schemas-microsoft-com:office:spreadsheet");
wbElem.SetAttribute("xmlns:ss", "urn:schemas-microsoft-com:office:spreadsheet");
webXml.AppendChild(wbElem);
XmlElement wsElem = webXml.CreateElement("Worksheet");
wsElem.SetAttribute("Name", "urn:schemas-microsoft-com:office:spreadsheet", sheetName );
wbElem.AppendChild(wsElem);
XmlElement tblElem = webXml.CreateElement("Table");
wsElem.AppendChild(tblElem);
XmlElement rowElem = webXml.CreateElement("Row");
tblElem.AppendChild(rowElem);
rowElem.AppendChild(createCellNode(webXml, "Title / ID"));
rowElem.AppendChild(createCellNode(webXml, "URL"));
rowElem.AppendChild(createCellNode(webXml, "Account"));
rowElem.AppendChild(createCellNode(webXml, "Name"));
return tblElem;
}
XmlElement createCellNode(XmlDocument xmlDoc, String data )
{
XmlElement cellElem = xmlDoc.CreateElement("Cell");
XmlElement dataElem = xmlDoc.CreateElement("Data");
dataElem.SetAttribute("Type", "urn:schemas-microsoft-com:office:spreadsheet", "String");
dataElem.InnerText = data;
cellElem.AppendChild(dataElem);
return cellElem;
}
}
}














