2012-06-26 14 views
5

Sto utilizzando lo spazio dei nomi System.DirectoryServices.AccountManagement per trovare gli utenti del dominio e i relativi gruppi di sicurezza AD. Funziona beneTrova i gruppi locali a cui appartiene un utente di dominio?

Sto anche utilizzando tale spazio dei nomi per interrogare i gruppi di sicurezza locali su un server remoto. Sono in grado di trovare un gruppo di sicurezza e quindi elencare gli utenti di quel gruppo senza problemi.

Quello che sto avendo problemi con la visualizzazione è che i gruppi locali di un utente di dominio appartiene a:

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 
} 

sto cercando di utilizzare il metodo GetGroups passando l'localMachine PrincipalContext ma gruppi vengono restituiti.

Gli utenti esistono solo nel dominio AD. Non c'è una voce per questo utente negli utenti locali su localMachine. Gli utenti del dominio vengono aggiunti ai gruppi di sicurezza locali.

Qualche idea? Mi piacerebbe essere in grado di estrarre un elenco di tutti i gruppi locali a cui appartiene questo utente del dominio e quindi verificare se esiste un determinato gruppo in tale elenco. L'unica opzione che funziona ora è per me cercare determinati gruppi sul sistema e vedere se l'utente del dominio appartiene a quel gruppo.

+0

domanda simile qui - si spera di qualche utilità - http://stackoverflow.com/questions/4809460/determine-nested-groups-of-windowsidentity-instance – dash

+0

Ho provato a farlo in questo modo. Il metodo FindByIdentity restituisce null quando si cerca l'utente sulla macchina. Presumo questo perché non è stato creato un vero utente locale. È un utente di dominio. Ho provato a passare il nome utente con e senza il dominio anteposto. –

+0

Scavando attraverso un vecchio codice, trovo che l'ho fatto esattamente come descritto; enumerare i gruppi di computer locali (tramite DirectorySearcher) e quindi elencarli per vedere se riesco a trovare un gruppo di cui l'utente è membro. Anche noi avevamo una gerarchia piuttosto superficiale. Spiacente non può essere di maggiore aiuto. – dash

risposta

2

Il seguente codice restituirà i gruppi locali che un utente del dominio è membro di:

 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

Questo codice dal mio computer locale restituisce solo un server connesso per circa 30 gruppi. Mi aspettavo che il metodo GetAuthorizationGroups() restituisse solo i gruppi dal contesto specificato nell'oggetto UserPrincipal. Questo metodo esegue anche una query sulla macchina su cui è in esecuzione il codice? –

1

So che la mia risposta è in ritardo, ma questo ha funzionato per me (dopo aver provato tutti i tipi di permutazioni):

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 } 
    ); 
} 

La chiamata è qualcosa di simile:

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