Solved

How to Return all user attributes given their samaccountname

Posted on 2009-07-01
13
2,527 Views
Last Modified: 2013-12-24
I'm trying to return the First Name and Last Name of a user by only providing the samaccountname to the search filter.
protected void Page_Load(object sender, EventArgs e)

    {

        GetActiveADUsers("LDAP://adBox.company.com", "CN=samaccountname=domain\\user");

    }
 

    public void GetActiveADUsers(string ldapString, string adSearchFilter)

    {

        DirectoryEntry de = new DirectoryEntry(ldapString,"domain\\username","password");

        DirectorySearcher deSearch = new DirectorySearcher();

        deSearch.SearchRoot = de;
 

        deSearch.SearchScope = SearchScope.Subtree; //Including the sub OU's

        deSearch.Filter = adSearchFilter;

        SearchResultCollection result = deSearch.FindAll();
 

        //Get User Array Here

        for (int x = 0; x < result.Count; x++)

        {

            string firstLastName = Convert.ToBoolean(result[x].Properties["name"].Count > 0) ? result[x].Properties["name"][0].ToString() : "";

            

            System.Web.HttpContext.Current.Response.Write(firstLastName + "<br />");
 

        }

    }

Open in new window

0
Comment
Question by:kvigor
  • 7
  • 6
13 Comments
 
LVL 70

Expert Comment

by:Chris Dent
ID: 24757007

Hey :)

I would do this...

Chris
protected void Page_Load(object sender, EventArgs e)

    {

        // Modified the ldapFilter so it searches for sAMAccountName

        GetActiveADUsers("LDAP://adBox.company.com", "(samaccountname=user)");

    }

 

    public void GetActiveADUsers(string ldapString, string adSearchFilter)

    {

        DirectoryEntry de = new DirectoryEntry(ldapString,"domain\\username","password");

        DirectorySearcher deSearch = new DirectorySearcher(de, adSearchFilter);

        // Passed in the constructor

        // deSearch.SearchRoot = de;
 

        // SubTree is the default, so really not required here. 

        deSearch.SearchScope = SearchScope.Subtree; //Including the sub OU's

        // Passed in the constructor

        // deSearch.Filter = adSearchFilter;

        // The sAMAccountName is a unique attribute in the search scope (single domain)

        // FindOne() saves us a loop or two

        SearchResult result = deSearch.FindOne();

 

        string firstName = result.Properties["givenname"][0].ToString();

        string lastName = result.Properties["sn"][0].ToString();

        string fullName = result.Properties["name"][0].ToString();

        string displayName = result.Properties["displayname"][0].ToString();        

    

        System.Web.HttpContext.Current.Response.Write(firstLastName + "<br />");

    }

Open in new window

0
 

Author Comment

by:kvigor
ID: 24759396
I'll try this solution in the morning.
0
 

Author Comment

by:kvigor
ID: 24764453
I get the following error with your code:

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error:
Line 41:         //string lastName = result.Properties["sn"][0].ToString();
Line 42:         //string fullName = result.Properties["name"][0].ToString();
Line 43:         string displayName = result.Properties["displayname"][0].ToString();
Line 44:
Line 45:         System.Web.HttpContext.Current.Response.Write(displayName + "<br />");
 I'm using the exact code you posted???
0
 
LVL 70

Expert Comment

by:Chris Dent
ID: 24764480

Suggests that displayName is blank (in AD). Does name return correctly?

Chris
0
 

Author Comment

by:kvigor
ID: 24764529
All properties returned blank: sn, name, and displayName.  I commented them out one by one thinking the same thing but I know I have a name and displayname as I tested my account.
0
 
LVL 70

Expert Comment

by:Chris Dent
ID: 24764535

Okay, I must have done something wrong then. One sec.

Chris
0
 

Author Comment

by:kvigor
ID: 24764606
I inserted the domain\username here:
(samaccountname=domain\\username)
0
 
LVL 70

Expert Comment

by:Chris Dent
ID: 24764619

That won't work.

sAMAccountName in the directory is just the username, domain doesn't get a look in there.

Chris
0
 
LVL 70

Accepted Solution

by:
Chris Dent earned 400 total points
ID: 24764773

I get no problems provided the search filter is correct. You could always test to see if the result is null? But that doesn't help much if it's supposed to return something :)

Anyway, take out the domain from the search filter, it can't be included there.

Chris
0
 

Author Comment

by:kvigor
ID: 24764827
So what am I not getting, I'm using this to get the samaccountname:
   username = User.Identity.Name.ToString();
and I'm passing in username var to here:
   GetActiveADUsers("LDAP://adBox.company.com", "HERE");  is there way this will work
 I'm actually going to get the fullname/display name from a different namespace because the directoryservices namespace may not be as user friendly as I need it to be.
0
 
LVL 70

Expert Comment

by:Chris Dent
ID: 24764863

As long as the "Name" value above is only the user name, and not "domain\username" then it's fine. Although with the code above it's expecting you to pass a valid LDAP filter (perhaps like "(samAccountName=" + username + ")").

That'll break a bit if you use the same user name in the authentication string for the directory entry and expect it to have the domain name there. If that is the case I would say pass user and domain as separate values, or build the filter in the function, parsing the username out of "domain\user".

Chris
0
 

Author Comment

by:kvigor
ID: 24764897
ohhhh! So Sorry that DID work I didn't understand what you meant by:
ID: 24764619 "domain doesn't get a look in there."
So I removed the "domain\" and all returned well. Thanks you saved me alot of time.

Your Solution like Ambien it Worked like a Dream : ^)
0
 

Author Closing Comment

by:kvigor
ID: 31598874
User was perfect in solution.
0

Join & Write a Comment

CCModeler offers a way to enter basic information like entities, attributes and relationships and export them as yEd or erviz diagram. It also can import existing Access or SQL Server tables with relationships.
Shadow IT is coming out of the shadows as more businesses are choosing cloud-based applications. It is now a multi-cloud world for most organizations. Simultaneously, most businesses have yet to consolidate with one cloud provider or define an offic…
This tutorial will walk an individual through the process of configuring their Windows Server 2012 domain controller to synchronize its time with a trusted, external resource. Use Google, Bing, or other preferred search engine to locate trusted NTP …
Polish reports in Access so they look terrific. Take yourself to another level. Equations, Back Color, Alternate Back Color. Write easy VBA Code. Tighten space to use less pages. Launch report from a menu, considering criteria only when it is filled…

762 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

22 Experts available now in Live!

Get 1:1 Help Now