10

クラスを使用して、System.DirectoryServices.ActiveDirectoryすべてのActiveDirectoryユーザーを検索しています。コードは非常に単純です。

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

ドメイン修飾されたユーザー名を「フレンドリー」(別名「Windows2000以前」の形式)で取得したい。「CONTOSO\SmithJ」。UserPrincipal.SamAccountNameユーザー名の部分を教えてくれますが、ドメインの部分を取得するにはどうすればよいですか?ドメインがマシンまたは現在のユーザーのドメインと同じになるとは想定できません。

4

2 に答える 2

7

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();
于 2012-05-22T17:47:22.133 に答える
0

OK、これが 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;
        }
    }
}
于 2012-05-26T12:40:15.210 に答える