Ich möchte überprüfen, ob ein Benutzer in einer bestimmten übergeordneten Organisationseinheit ist.Abrufen der übergeordneten OU des Benutzers in Active Directory mit C#
Wie kann ich das tun?
Überprüfen Sie unten Code für eine klare Beschreibung dessen, was ich suche.
using System.DirectoryServices.AccountManagement;
public bool IsUserInOU(string samAccountName, string OUName){
using (var context = new PrincipalContext(ContextType.Domain))
{
using (var user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, samAccountName))
{
//Check if the user is in the OU specified in OUName
//Something like:
//return user.IsInOU(OUName);
}
}
}
public void TestIt_1(){
//The parent OU of this user is "AwesomeOU"
string samAccountName = "Joe";
string OUName = "AwesomeOU";
bool expected = true;
bool actual = IsUserInOU(samAccountName, OUName);
Assert.AreEqual(expected, actual);
}
public void TestIt_2(){
//The parent OU of this user is "WhateverOU"
string samAccountName = "Mike";
string OUName = "AwesomeOU";
bool expected = false;
bool actual = IsUserInOU(samAccountName, OUName);
Assert.AreEqual(expected, actual);
}
Die Domain:
- Nationale OU
- Ehrfürchtig OU
- Joe
- Was OU
- Mike
- Ehrfürchtig OU
Lösung 1 nach Antwort der empi
Mit den Informationen von empi gegeben, schrieb ich die folgende Methode, um die erste OU in der DistinguishedName zu extrahieren. Danach ist der Rest ein Kinderspiel.
public static string GetOUForUser(string samAccountName)
{
using (var context = new PrincipalContext(ContextType.Domain))
{
using (var user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, samAccountName))
{
//System.Console.WriteLine(user.DistinguishedName);
int startIndex = user.DistinguishedName.IndexOf("OU=", 1) + 3; //+3 for length of "OU="
int endIndex = user.DistinguishedName.IndexOf(",", startIndex);
var group = user.DistinguishedName.Substring((startIndex), (endIndex - startIndex));
return group;
}
}
}
Lösung 2 nach Antwort des JPBlanc
public static string GetOUForUser(string samAccountName)
{
using (var context = new PrincipalContext(ContextType.Domain))
{
using (var user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, samAccountName))
{
using (DirectoryEntry deUser = user.GetUnderlyingObject() as DirectoryEntry)
{
using (DirectoryEntry deUserContainer = deUser.Parent)
{
return deUserContainer.Properties["Name"].Value.ToString();
}
}
}
}
}
Funktioniert nicht, wenn Objekte Kommas in ihrem definierten Namen haben. Sie müssen mit der Art umgehen, wie diese maskiert sind, oder verwenden Sie JPBlanc Solution 2. – Chalky