Вопрос по .net – Где находится доменное имя в объекте UserPrincipal?

9

Я используюSystem.DirectoryServices.ActiveDirectory классы, чтобы найти всех пользователей Active Directory. Код очень прост:

var context = new PrincipalContext(ContextType.Domain);
var searcher = new PrincipalSearcher(new UserPrincipal(context));
var results = searcher.FindAll();

Я хочу получить доменное имя пользователя в разделе & quot; дружественный & quot; (он же. «pre-Windows 2000» формат), например. & Quot; Contoso \ ИвановИван & Quot ;.UserPrincipal.SamAccountName дает мне часть имени пользователя, но как мне получить часть домена? Я не могу предположить, что домен будет таким же, как домен компьютера или текущего пользователя.

Возможный дубликат:stackoverflow.com/questions/4284641/… MichelZ

Ваш Ответ

2   ответа
0

окончательный код, который я придумал, используя ответ JPBlanc иответ связан с MichaelZ, Он показывает SID, отображаемое имя и DOMAIN \ username для каждого пользователя.

    var ldapUrl = "LDAP://" + defaultNamingContext;

    using (var rootDe = new DirectoryEntry(ldapUrl))
    using (var searcher = new DirectorySearcher(rootDe))
    {
        searcher.SearchScope = SearchScope.Subtree;
        searcher.PropertiesToLoad.Add("objectSid");
        searcher.PropertiesToLoad.Add("displayName");
        searcher.PropertiesToLoad.Add("msDS-PrincipalName");
        searcher.Filter = "(&(objectClass=user)(objectCategory=person))";

        var results = searcher.FindAll();

        foreach (SearchResult result in results)
        {
            var qualifiedUsername = GetSinglePropertyValue(result, "msDS-PrincipalName");
            var displayName = GetSinglePropertyValue(result, "displayName");
            var sid = new SecurityIdentifier((byte[])GetSinglePropertyValue(result,"objectSid"), 0);

            Console.WriteLine("User: {0}\r\n\tDisplay name: {1}\r\n\tSID: {2}",
                qualifiedUsername, displayName, sid);
        }
    }

    private static object GetSinglePropertyValue(SearchResult result, string propertyName)
    {
        var value = result.Properties[propertyName];
        if (value.Count == 0)
            return null;
        if (value.Count == 1)
            return value[0];
        throw new ApplicationException(string.Format("Property '{0}' has {1} values for {2}",
            propertyName, value.Count, result.Path));
    }

И получить контекст именования по умолчанию для домена компьютера (какответил здесь):

private static string GetDefaultNamingContext()
{
    // This check is fast
    try
    {
        Domain.GetComputerDomain();
    }
    catch (ActiveDirectoryObjectNotFoundException)
    {
        return null;
    }

    // This takes 5 seconds if the computer is not on a domain
    using (var rootDe = new DirectoryEntry("LDAP://RootDSE"))
    {
        try
        {
            return (string)rootDe.Properties["defaultNamingContext"][0];
        }
        catch (COMException ex)
        {
            if (ex.ErrorCode == -2147023541)
                return null;
            throw;
        }
    }
}
6

msDS-PrincipalName имя домена NetBIOS, за которым следует обратная косая черта (& quot; \ & quot;).

Вы можете найти это используя:

/* Retreiving the root domain attributes
 */ 
sFromWhere = "LDAP://DC_DNS_NAME:389/dc=dom,dc=fr"; 
DirectoryEntry deBase = new DirectoryEntry(sFromWhere, "AdminLogin", "PWD"); 

DirectorySearcher dsLookForDomain = new DirectorySearcher(deBase); 
dsLookForDomain.Filter = "(objectClass=*)"; 
dsLookForDomain.SearchScope = SearchScope.base; 
dsLookForDomain.PropertiesToLoad.Add("msDS-PrincipalName"); 

SearchResult srcDomains = dsLookForDomain.FindOne();
ПРИМЕЧАНИЕ: это может быть домен \ имя пользователя или SID пользователя в соответствии с MSDN:msdn.microsoft.com/en-us/library/cc223404.aspx
+1 Спасибо, msDS-PrincipalName выглядит так, как я хочу. EMP

Похожие вопросы