2012-06-26 16 views
5

Używam przestrzeni nazw System.DirectoryServices.AccountManagement, aby znaleźć użytkowników domeny i odpowiadające im grupy zabezpieczeń AD. To działa dobrze.Znajdź lokalne grupy, do których należy użytkownik domeny?

Używam również tej przestrzeni nazw do wysyłania zapytań do lokalnych grup bezpieczeństwa na zdalnym serwerze. Jestem w stanie znaleźć grupę bezpieczeństwa, a następnie wymienić użytkowników tej grupy bez problemu.

Co mam problemy z wyświetla których lokalne grupy należy dany użytkownik domeny do:

PrincipalContext localmachine = new PrincipalContext(ContextType.Machine, "ServerName"); 
PrincipalContext domain = new PrincipalContext(ContextType.Domain); 

// find the user using the domain context (Works fine) 
UserPrincipal user = UserPrincipal.FindByIdentity(domain, userName); 

// if found - grab its groups 
if (user != null) 
{ 
    // The get groups method is the only method that would accept a new context 
    PrincipalSearchResult<Principal> groups = user.GetGroups(localMachine); 

    // no groups are returned .... removed rest of code 
} 

Ja próbuje użyć metody getgroups przechodzący w localMachine PrincipalContext ale żadne grupy są zwracane.

Użytkownicy istnieją tylko w domenie AD. Nie ma wpisu dla tego użytkownika w lokalnych użytkownikach na localMachine. Użytkownicy domeny są dodawani do lokalnych grup zabezpieczeń.

Wszelkie pomysły? Chciałbym móc pobrać listę wszystkich lokalnych grup, do których należy ten użytkownik domeny, a następnie sprawdzić, czy pewne grupy istnieją na tej liście. Jedyną opcją, która działa teraz, jest przeszukiwanie niektórych grup w systemie i sprawdzanie, czy użytkownik domeny należy do tej grupy.

+0

Podobne pytanie tutaj - mam nadzieję, że pewnego użytku - http://stackoverflow.com/questions/4809460/determine-nested-groups-of-windowsidentity-instance – dash

+0

Próbowałem zrobić to w ten sposób. Metoda FindByIdentity zwraca wartość NULL podczas wyszukiwania użytkownika na komputerze. Zakładam, że dzieje się tak, ponieważ nie utworzono faktycznego użytkownika lokalnego. Jest to użytkownik domeny. Próbowałem już przekazać nazwę użytkownika z domeną i bez niej. –

+0

Przekopując stary kod, stwierdzam, że zrobiłem to dokładnie tak, jak opisałeś; wyliczanie lokalnych grup maszyn (za pośrednictwem DirectorySearchera), a następnie wyliczanie ich w celu sprawdzenia, czy mogę znaleźć grupę, której członkiem jest użytkownik. Mieliśmy też dość płytką hierarchię. Niestety nie może być więcej pomocy. – dash

Odpowiedz

2

Poniższy kod zwróci lokalnych grup, które użytkownik domeny jest członkiem:

 PrincipalContext domain = new PrincipalContext(ContextType.Domain); 
     UserPrincipal user = UserPrincipal.FindByIdentity(domain, userName); 
     foreach (GroupPrincipal group in user.GetAuthorizationGroups()) 
     { 
      if (group.Context.ConnectedServer == serverName) 
       Console.Out.WriteLine("{0}\\{1}", group.Context.Name, group.SamAccountName); 
     } 
+1

Ten kod z mojej lokalnej maszyny zwraca tylko jeden podłączony serwer dla około 30 grup. Spodziewałem się, że metoda GetAuthorizationGroups() zwróci tylko grupy z kontekstu określonego w obiekcie UserPrincipal. Czy ta metoda sprawdza również komputer, na którym działa kod? –

1

Wiem, że moja odpowiedź jest późno, ale ten pracował dla mnie (po Próbowałem wszystkie rodzaje permutacji):

private static IList<string> GetUserLocalGroups(string userAccountName, string computerName, string domainName) 
{ 
    List<string> groups = new List<string>(); 

    // We have to deal with a local computer 
    DirectoryEntry root = new DirectoryEntry(String.Format("WinNT://{0},Computer", computerName), null, null, AuthenticationTypes.Secure); 


    foreach (DirectoryEntry groupDirectoryEntry in root.Children) 
    { 
    if (groupDirectoryEntry.SchemaClassName != "Group") 
     continue; 

    string groupName = groupDirectoryEntry.Name; 
    Console.WriteLine("Checking: {0}", groupName); 
    if (IsUserMemberOfGroup(groupDirectoryEntry, String.Format("WinNT://{0}/{1}", domainName, userAccountName))) 
    { 
     groups.Add(groupName); 
    } 
    } 

    return groups; 
} 

private static bool IsUserMemberOfGroup(DirectoryEntry group, string userPath) 
{ 
    return (bool)group.Invoke(
     "IsMember", 
     new object[] { userPath } 
    ); 
} 

wezwanie jest coś takiego:

GetUserLocalGroups("samaccountname", "computerName.yourdomain", "yourdomain");