получить локальные группы, а не основные группы для пользователя домена - PullRequest
3 голосов
/ 18 декабря 2010

У меня есть код для получения групп, к которым принадлежит пользователь.

try 
        {
            DirectoryEntry adRoot = new DirectoryEntry(string.Format("WinNT://{0}", Environment.UserDomainName));

            DirectoryEntry user = adRoot.Children.Find(completeUserName, "User");                
            object obGroups = user.Invoke("Groups");
            foreach (object ob in (IEnumerable)obGroups)
            {
                // Create object for each group.
                DirectoryEntry obGpEntry = new DirectoryEntry(ob);
                listOfMyWindowsGroups.Add(obGpEntry.Name);
            }
        return true;
        }
        catch (Exception ex)
        {
            new GUIUtility().LogMessageToFile("Error in getting User MachineGroups = " + ex);
            return false;
        }

приведенный выше код работает нормально, когда мне нужно найти группы локального пользователя, но

дляПользователь домена возвращает значение «Пользователь домена», что является своего рода странным, поскольку он входит в 2 локальные группы.

Пожалуйста, можете помочь в решении этой загадки.спасибо

Исследования

Я обнаружил, что мне возвращают основную группу пользователя домена

, называемую группой "Пользователь домена"

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

другой код с использованием LDAP

        string domain = Environment.UserDomainName;
        DirectoryEntry DE = new DirectoryEntry("LDAP://" + domain, null, null, AuthenticationTypes.Secure);
        DirectorySearcher search = new DirectorySearcher();

        search.SearchRoot = DE;         
        search.Filter = "(SAMAccountName=" + completeUserName + ")";  //Searches active directory for the login name

        search.PropertiesToLoad.Add("displayName");  // Once found, get a list of Groups

        try
        {
            SearchResult result = search.FindOne(); // Grab the records and assign them to result
            if (result != null)
            {
                DirectoryEntry theUser = result.GetDirectoryEntry();
                theUser.RefreshCache(new string[] { "tokenGroups" });
                foreach (byte[] resultBytes in theUser.Properties["tokenGroups"])
                {
                    System.Security.Principal.SecurityIdentifier mySID = new System.Security.Principal.SecurityIdentifier(resultBytes, 0);

                    DirectorySearcher sidSearcher = new DirectorySearcher();

                    sidSearcher.SearchRoot = DE;
                    sidSearcher.Filter = "(objectSid=" + mySID.Value + ")";
                    sidSearcher.PropertiesToLoad.Add("distinguishedName");

                    SearchResult sidResult = sidSearcher.FindOne();

                    if (sidResult != null)
                    {
                        listOfMyWindowsGroups.Add((string)sidResult.Properties["distinguishedName"][0]);
                    }
                }
            }
            else
            {
                new GUIUtility().LogMessageToFile("no user found");

            }
            return true;
        }

        catch (Exception ex)
        {

            new GUIUtility().LogMessageToFile("Error obtaining group names: " + ex.Message + " Please contact your administrator."); // If an error occurs report it to the user.
            return false;
        }

это тоже работает, но я получаю тот же результат "Пользователи домена".Может кто-нибудь1 подскажет, как получить локальные группы компьютеров ... ????

Ответы [ 2 ]

2 голосов
/ 01 января 2011

Если вы используете .NET 3.5, вы можете использовать System.DirectoryService.AccountManagement для управления всеми пользователями и группами. В частности, UserPrincipal.GetAuthorizationGroups - это именно то, что вы ищете. Он извлекает как локальную группу, так и группу компьютеров для определенных пользователей. Если группа является локальной группой, GroupPrincipal.Context.Name показывает имя компьютера, откуда пришла группа. Если группа является группой домена, GroupPrincipal.Context.Domain показывает имя домена, из которого происходит группа.

PrincipalContext context = new PrincipalContext(ContextType.Domain, "yourdomain.com");
UserPrincipal userPrincipal = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, "youruser"); 

foreach (GroupPrincipal group in userPrincipal.GetAuthorizationGroups())
{
    Console.Out.WriteLine("{0}\\{1}", group.Context.Name, group.SamAccountName);
}
0 голосов
/ 19 декабря 2010

Я бы сказал, что проблема в том, что ваш поиск начинается в домене.Вы хотите изменить местоположение поиска на локальный компьютер.

Что-то подобное сделает это;

DirectoryEntry AD = new DirectoryEntry("WinNT://" + Environment.MachineName + ",computer");
...