MOSS组、用户、权限级别,以及出现:用户不存在或用户不唯一 及 拒绝访问 问题的解决方法

问题描述:

//角色模拟:这里要特别注意,如果使用角色模拟可能会出现"此用户不存在或不唯一""拒绝访问"的错误

   //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++)

         {

             // 根据RoleDefinitionID,返回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 
   

原文地址:https://www.cnblogs.com/LeimOO/p/1377503.html