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
- UserPrincipal.Enabled returns False for accounts that are in fact enabled?
- 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 ...
Se è possibile aggiungere le istruzioni esatte dal proprio collegamento, la risposta sarebbe decisamente migliore e sicura dall'essere un collegamento interrotto! – ForceMagic
Grazie. Aggiunto blockquote di informazioni rilevanti dal link. –