2013-05-15 12 views
12

Sto cercando di determinare se un account utente in Active Directory è abilitato. Per questo io uso il seguente codice:Perché UserPrincipal.Enabled restituisce valori diversi?

string domain = "my domain"; 
string group = "my security group"; 
string ou = "my OU"; 

//init context 
using (var cnt= new PrincipalContext(ContextType.Domain, domain)) 
{ 
    //find the necessary security group 
    using (GroupPrincipal mainGroup 
       = GroupPrincipal.FindByIdentity(cnt, IdentityType.Guid, group)) 
    { 
     if (mainGroup != null) 
     { 
      //get the group's members 
      foreach (var user in mainGroup.GetMembers() 
            .OfType<UserPrincipal>() 
            .Where(u => u.DistinguishedName.Contains(ou))) 
      { 
       //ensure that all the info about the account is loaded 
       //by using FindByIdentity as opposed to GetMembers 
       var tmpUser= UserPrincipal.FindByIdentity(cnt, 
                  user.SamAccountName); 
       //actually I could use `user` variable, 
       //as it gave the same result as `tmpUser`. 

       //print the account info 
       Console.WriteLine(tmpUser.Name + "\t" + 
            tmpUser.Enabled.HasValue + "\t" + 
            tmpUser.Enabled.Value);      
      } 
     } 
    } 
} 

Il problema è che quando si esegue questo codice con un account amministrativo, ottengo il risultato reale, mentre quando l'eseguo con un account non-privilegiato, user.Enabled rendimenti false per alcuni account, mentre dovrebbe essere true.

L'unica q simile & una Sono riuscito a trovare sono

  1. UserPrincipal.Enabled returns False for accounts that are in fact enabled?
  2. Everything in Active Directory via C#.NET 3.5 (Using System.DirectoryServices.AccountManagement)

che non aiutano qui.

Perché è così? Quali sono le mie opzioni per ottenere queste informazioni con un account non privilegiato?


Ecco un altro approccio: How to determine if user account is enabled or disabled:

private bool IsActive(DirectoryEntry de) 
{ 
    if (de.NativeGuid == null) 
     return false; 

    int flags = (int)de.Properties["userAccountControl"].Value; 

    if (!Convert.ToBoolean(flags & 0x0002)) 
     return true; 
    else 
     return false; 
} 

Lo stesso approccio è descritto in Active Directory Objects and C#.

Tuttavia, quando si esegue un account utente non privilegiato, l'attributo userAccountControl è null e non è possibile determinare lo stato dell'account.


La soluzione qui è quello di utilizzare PrincipalContext Constructor, specificando le credenziali di un utente con privilegi sufficienti per accedere dC.

Non mi è chiaro, perché l'utente non privilegiato ha avuto accesso a AD e non è stato possibile ottenere i valori di alcuni determinati attributi dell'account. Probabilmente questo non ha nulla a che fare con C# e dovrebbe essere configurato in AD ...

risposta

1

È necessario delegare le autorizzazioni in Active Directory per gli account che eseguiranno le query di Active Directory. Questo è quello che dovevo fare affinché le mie applicazioni funzionassero (anche se stiamo eseguendo altre attività amministrative sugli account utente).

Controllare Here per le istruzioni su come delegare le autorizzazioni (o vedere il blocco qui sotto).

Si può cui la seguente procedura per eseguire la delega:

  • Avviare la Delega guidata del controllo eseguendo le seguenti operazioni:
    • Aprire Utenti e computer di Active Directory.
    • Nella struttura della console, fare doppio clic sul nodo del dominio.
    • Nel menu dei dettagli, fare clic con il pulsante destro del mouse sull'unità organizzativa, fare clic su controllo delegato e fare clic su Avanti.
    • Selezionare gli utenti o il gruppo a cui si desidera delegare attività amministrative comuni.Per fare ciò, effettuare le seguenti operazioni:
    • Nella pagina Utenti o gruppi, fare clic su Aggiungi.
    • Negli utenti, computer o gruppi selezionati, scrivere i nomi degli utenti e dei gruppi a cui è necessario delegare il controllo dell'unità organizzativa, fare clic su OK. E fai clic su Avanti.
    • Assegna attività comuni da delegare. Per fare ciò, eseguire le seguenti attività comuni.
    • Nelle attività di delgate page, fare clic su delegare le seguenti attività comuni.
    • Nelle attività per delegare la pagina, selezionare le attività che si desidera delegare e fare clic su OK. Fare clic su Fine

Per esempio: Per delegare all'amministratore di spostare gli oggetti utente/computer, è possibile utilizzare la modalità anticipo dC utente e computer ed eseguire la delega. Dovrebbe avere il privilegio di scrittura in entrambe le unità organizzative per lo spostamento dell'oggetto. Per la scrittura di nuovi valori, gli amministratori account dovrebbe hanno delegato i valori per l'account utente (privilegio completa in specifici OU pure.

Un'altra cosa merita di essere esaminata è se i conti hanno l'userAccountControl. Ho sentito dire che gli account che mancano questo attributo potrebbero non essere riportati correttamente Nella maggior parte degli scenari questo attributo deve essere impostato su Conto normale

+0

Se è possibile aggiungere le istruzioni esatte dal proprio collegamento, la risposta sarebbe decisamente migliore e sicura dall'essere un collegamento interrotto! – ForceMagic

+1

Grazie. Aggiunto blockquote di informazioni rilevanti dal link. –

Problemi correlati