问题描述:
//角色模拟:这里要特别注意,如果使用角色模拟可能会出现"此用户不存在或不唯一"或"拒绝访问"的错误
//impersonate.BeginImpersonate();
// 这句很重要,否则无法添加组
web.AllowUnsafeUpdates = true;
// 1. 添加用户组
web.SiteGroups.Add(GroupName, owner, defaultUser, description);
web.Update();
SPGroup group = null;
// 判断组是否新建成功
for (int i = 0; i < web.SiteGroups.Count; i++)
{
if (web.SiteGroups[i].Name.Equals(GroupName))
{
group = web.SiteGroups[i];
}
}
// 如果创建不成功,则返回false
if (null == group)
{
Page.ClientScript.RegisterClientScriptBlock(typeof(Page), "key", "alert('[系统提示]新建组不成功,请重试!');", true);
return false;
}
// 2. 向组里添加用户
for (int j = 0; j < lstUsers.Items.Count; j++)
{
//登录名:域名+用户登录账户
string loginName = ADDomain + @"\" + lstUsers.Items[j].Value;
// 判断该用户是否已在组中
bool hasExist = false;
for (int h = 0; h < group.Users.Count; h++)
{
if (group.Users[h].LoginName.Equals(loginName))
{
hasExist = true;
}
}
if (!hasExist)
{
group.AddUser(loginName, "", lstUsers.Items[j].Text, "custom add");
group.Update();
}
}
// 3. 为组分配权限级别
ListItemCollection lic = GetSelectedRoles(cblRoles);
for (int i = 0; i < lic.Count; i++)
{
// 根据RoleDefinition的ID,返回RoleDefinition
SPRoleDefinition roleDefinition = GetRoleDefinitionByID(siteURL, webRelativeURL, lic[i].Value);
if (roleDefinition != null)
{
SPRoleAssignment roleAssignments = new SPRoleAssignment(group);
SPRoleDefinition roleDefinitions = roleDefinition;
roleAssignments.RoleDefinitionBindings.Add(roleDefinitions);
web.RoleAssignments.Add(roleAssignments);
}
}
//impersonate.StopImpersonate();
如果在角色模拟部分调用下面的代码:
impersonate.BeginImpersonate();
CreateUser(…..)
impersonate.StopImpersonate();
如下:
protected SPUser CreateUser(string strLoginName, string strEMail, string strName, string strNotes, string strSiteURL)
{
SPUser spReturn = null;
try
{
//Open the SharePoint site
using (SPSite spSite = new SPSite(strSiteURL)) // 这里将会出错:“拒绝访问”
{
using (SPWeb spWeb = spSite.OpenWeb())
{
spWeb.AllowUnsafeUpdates = true;
//Assign role and add user to site
SPRoleAssignment spRoleAssignment = new SPRoleAssignment(strLoginName, strEMail, strName, strNotes);
//Using Contribute, might need high access
SPRoleDefinition spSPRoleDefinition = spWeb.RoleDefinitions["读取"];
spRoleAssignment.RoleDefinitionBindings.Add(spSPRoleDefinition);
spWeb.RoleAssignments.Add(spRoleAssignment);
//Update site
spWeb.Update();
spWeb.AllowUnsafeUpdates = false;
spReturn = spWeb.AllUsers[strLoginName];
}
}
}
catch (Exception ex)
{
}
return spReturn;
}
原因:
角色模拟的问题
解决方案一:
使用域管理员帐户进行操作时没有问题:Domain Admins组成员。当然这在实际使用中不是一个好的解决方案。
解决方案二:
删除角色模拟。在匿名用户访问状态下面,角色模拟经常出错。我运行了许多次都出错了。而且还要明文密码,不太安全。
如果对moss操作权限不够,用权限提升:
SPSecurity.RunWithElevatedPrivileges(delegate()
{
// implementation details omitted
});
运行这一段代码的用户是应用程序池的用户。
详见: http://soft.zdnet.com.cn/software_zone/2007/1104/605943.shtml