.net UserPrincipal对象中的域名在哪里?

.net UserPrincipal对象中的域名在哪里?,.net,active-directory,directoryservices,.net,Active Directory,Directoryservices,我正在使用System.DirectoryServices.ActiveDirectory类查找所有Active Directory用户。代码非常简单: var context = new PrincipalContext(ContextType.Domain); var searcher = new PrincipalSearcher(new UserPrincipal(context)); var results = searcher.FindAll(); 我想以“friendly”(又名

我正在使用
System.DirectoryServices.ActiveDirectory
类查找所有Active Directory用户。代码非常简单:

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

我想以“friendly”(又名“pre-Windows 2000”格式)获取域限定用户名,例如“CONTOSO\SmithJ”
UserPrincipal.SamAccountName
提供了用户名部分,但如何获取域部分?我不能假设域将与计算机或当前用户的域相同。

对于AD DS,
msDS PrincipalName
的值是NetBIOS域名,后跟反斜杠(\)

您可以通过以下方式找到它:

/* 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();

好的,这里是我使用JPBlanc的答案和。它显示每个用户的SID、显示名称和域\用户名

    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));
    }
以及获取计算机域(as)的默认命名上下文:


可能重复:注意:根据MSDN,它可能是域\用户名或用户的SID:
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;
        }
    }
}