Вопрос по active-directory, c#, c#-3.0 – Можете ли вы найти основную группу пользователя Active Directory в C #?

4

Я работаю над приложением, которое управляет учетными записями пользователей в Active Directory. Я использую пространство имен System.DirectoryServices.AccountManagement везде, где это возможно, но я не могу понять, как определить первичную группу пользователя. Когда я пытаюсь удалить группу, которая является основной группой пользователя, я получаю исключение. Вот мой текущий код:

private void removeFromGroup(UserPrincipal userPrincipal, GroupPrincipal groupPrincipal) {
    TODO: Check to see if this Group is the user's primary group.
    groupPrincipal.Members.Remove(userPrincipal);
    groupPrincipal.Save();
}

Есть ли способ получить имя основной группы пользователя, чтобы я мог выполнить некоторую проверку, прежде чем пытаться удалить пользователя из этой группы?

Ваш Ответ

3   ответа
0

RID основной группы пользователя сохраняется в «primaryGroupID». атрибут на объекте пользователя. Вы должны получить DirectoryEntry для данного пользователя (или другого API пользователя), чтобы получить это значение. После получения этого значения вам нужно будет преобразовать его в SID для основной группы, а затем получить группу из этого.

Есть статья в КБ, в которой более подробно об этом, а также в VB-коде о том, как найти основную группу, здесь:http://support.microsoft.com/kb/297951

-2
       using (PrincipalContext context = XXX)
        {   //get the group
                using (GroupPrincipal groupPrincipal =
                        GroupPrincipal.FindByIdentity(context,IdentityType.SamAccountName, group))
                {
                    if (groupPrincipal != null)
                    {
                        //get the user
                        using (UserPrincipal userPrincipal =
                  UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, userName))
                        {
                            if (userPrincipal != null)
                            {
                                returnValue = userPrincipal.IsMemberOf(groupPrincipal);
                            }
                        }
                    }
                }

        }
5

но этот фрагмент кода взят из моегорасфокусированный Браузер ADSI, который я написал полностью на C # (в дни .NET 1.1) и который, как известно, работает - не красиво, но функционально:

private string GetPrimaryGroup(DirectoryEntry aEntry, DirectoryEntry aDomainEntry)
{
   int primaryGroupID = (int)aEntry.Properties["primaryGroupID"].Value;
   byte[] objectSid = (byte[])aEntry.Properties["objectSid"].Value;

   StringBuilder escapedGroupSid = new StringBuilder();

   // Copy over everything but the last four bytes(sub-authority)
   // Doing so gives us the RID of the domain
   for(uint i = 0; i < objectSid.Length - 4; i++)
   {
      escapedGroupSid.AppendFormat("\\{0:x2}", objectSid[i]);
   }

   //Add the primaryGroupID to the escape string to build the SID of the primaryGroup
   for(uint i = 0; i < 4; i++)
   {
      escapedGroupSid.AppendFormat("\\{0:x2}", (primaryGroupID & 0xFF));
      primaryGroupID >>= 8;
   }

   //Search the directory for a group with this SID
   DirectorySearcher searcher = new DirectorySearcher();
   if(aDomainEntry != null)
   {
       searcher.SearchRoot = aDomainEntry;
   }

   searcher.Filter = "(&(objectCategory=Group)(objectSID=" + escapedGroupSid.ToString() + "))";
   searcher.PropertiesToLoad.Add("distinguishedName");

   return searcher.FindOne().Properties["distinguishedName"][0].ToString();
}

Надеюсь это поможет.

Марк

да .. это работает ..
Вот это да. некрасиво но это работает :) +1

Похожие вопросы