J'ai un code pour vérifier si l'utilisateur est membre d'un groupe. Je l'utilise lors de ma connexion.Vérifier si l'utilisateur est membre d'un groupe
Veuillez noter que j'ai un utilisateur de domaine et un utilisateur local par ex. testdomain\administrator
et administrator
.
C'est le code que j'utilise:
using (DirectoryEntry groupEntry = new DirectoryEntry("WinNT://./" + userGroupName + ",group"))
{
foreach (object member in (IEnumerable)groupEntry.Invoke("Members"))
{
using (DirectoryEntry memberEntry = new DirectoryEntry(member))
{
string completeName = memberEntry.Name;
DirectoryEntry domainValue = GUIUtility.FindDomain(memberEntry);
if (domainValue != null)
{
completeName = domainValue.Name + "\\" + memberEntry.Name;
}
Global.logger.Info("completeName from " + userGroupName + " = " + completeName);
if (userName.Equals(completeName, StringComparison.InvariantCultureIgnoreCase))
{
Global.logger.Debug("IsUserPartOfWindowsGroup returned True with username =" + userName + " , UserGroupName = " + userGroupName);
return true;
}
}
}
Global.logger.Debug("IsUserPartOfWindowsGroup returned false for username =" + userName + " , UserGroupName = " + userGroupName);
return false;
}
Ce code fonctionne, mais
DirectoryEntry domainValue = GUIUtility.FindDomain(memberEntry);
prend beaucoup de temps dans le profileur comme je le vois. Y a-t-il un moyen meilleur/plus rapide de gérer cela?
public static DirectoryEntry FindDomain(DirectoryEntry memberEntry)
{
if (memberEntry.Parent != null)
{
if (memberEntry.Parent.SchemaClassName.Equals("domain", StringComparison.InvariantCultureIgnoreCase))
{
return memberEntry.Parent;
}
}
return null;
}
une autre façon:
DirectoryEntry entry = new DirectoryEntry("LDAP://" + domain, userName, Password);
DirectorySearcher mySearcher = new DirectorySearcher(entry);
mySearcher.Filter = "(&(objectClass=user)(|(cn=" + userName + ")(sAMAccountName=" + userName + ")))";
SearchResult result = mySearcher.FindOne();
Global.logger.Info("result == " + result.Path);
foreach (string GroupPath in result.Properties["memberOf"])
{
if (GroupPath.Contains(adminGroupName))
{
Global.logger.Info(compUsrNameForEncryption + "exists in " + adminGroupName);
}
}
On pourrait sans doute aider à mieux si nous savions ce qui était 'GUIUtility.FindDomain'. De plus, les nouvelles classes (ish) [System.DirectoryServices.AccountManagement] (http://msdn.microsoft.com/en-us/library/system.directoryservices.accountmanagement.aspx) rendent ce genre de chose beaucoup plus simple. –
[Question connexe] (http://stackoverflow.com/q/9603777/635634), le code dans [ma réponse] (http://stackoverflow.com/a/9604203/635634) à cette question vous aiderait probablement aussi bien. –
hey babcock .. j'ai ajouté la fonction finddomain. aussi que faire si l'utilisateur ne fait pas partie d'un domaine? – user175084