How to get username and SID for user by a domain name in ldap

后端 未结 1 464
醉梦人生
醉梦人生 2020-12-24 10:15

I am trying to get the user information for a specific domain which will be the input of the program. On the basis of the domain name it should return the list of the users

相关标签:
1条回答
  • If you're on .NET 3.5 and up and talking about Active Directory, then you should check out the System.DirectoryServices.AccountManagement (S.DS.AM) namespace. Read all about it here:

    • Managing Directory Security Principals in the .NET Framework 3.5
    • MSDN docs on System.DirectoryServices.AccountManagement

    Basically, you can define a domain context and easily find users and/or groups in AD:

    // set up domain context
    PrincipalContext ctx = new PrincipalContext(ContextType.Domain);
    
    // find a user
    UserPrincipal user = UserPrincipal.FindByIdentity(ctx, "SomeUserName");
    
    if(user != null)
    {
       // do something here....     
       var usersSid = user.Sid;
    
       // not sure what you mean by "username" - the "DisplayName" ? The "SAMAccountName"??
       var username = user.DisplayName;
       var userSamAccountName = user.SamAccountName;
    }
    

    The new S.DS.AM makes it really easy to play around with users and groups in AD!

    Update: if you need to loop through all the users of a domain - try this:

    You can use a PrincipalSearcher and a "query-by-example" principal to do your searching:

    // create your domain context
    PrincipalContext ctx = new PrincipalContext(ContextType.Domain);
    
    // define a "query-by-example" principal - here, we search for a UserPrincipal 
    UserPrincipal qbeUser = new UserPrincipal(ctx);
    
    // create your principal searcher passing in the QBE principal    
    PrincipalSearcher srch = new PrincipalSearcher(qbeUser);
    
    // find all matches
    foreach(var found in srch.FindAll())
    {
        UserPrincipal user = found as UserPrincipal;
    
        if(user != null)
        {
           // do whatever here 
           var usersSid = user.Sid;
    
           // not sure what you mean by "username" - the "DisplayName" ? 
           var username = user.DisplayName;
           var userSamAccountName = user.SamAccountName;
        }
    }
    

    Update #2: if you can't (or don't want to) use the S.DS.AM approach - which is the easiest, for Active Directory, by far - then you need to fall back to the System.DirectoryServices classes and methods:

    // define the root of your search
    DirectoryEntry root = new DirectoryEntry("LDAP://dc=YourCompany,dc=com");
    
    // set up DirectorySearcher  
    DirectorySearcher srch = new DirectorySearcher(root);
    srch.Filter = "(objectCategory=Person)";
    srch.SearchScope = SearchScope.Subtree;
    
    // define properties to load
    srch.PropertiesToLoad.Add("objectSid");
    srch.PropertiesToLoad.Add("displayName");
    
    // search the directory
    foreach(SearchResult result in srch.FindAll())
    {
       // grab the data - if present
       if(result.Properties["objectSid"] != null && result.Properties["objectSid"].Count > 1)
       {
           var sid = result.Properties["objectSid"][0];
       }
    
       if(result.Properties["displayName"] != null && result.Properties["displayName"].Count > 0)
       {
           var userName = result.Properties["displayName"][0].ToString();
       }
    }
    
    0 讨论(0)
提交回复
热议问题