Retrieve active user from Active Directory using C#

So far i change "DHAEST" code to modifed based on my need.

Class Library File

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.DirectoryServices;

namespace ActiveDir
{
    public class Employee
    {
        // instance variables 
        public String useraccountcontrol;
        //   ...
        // Constructors

        public String FullName()
        {

            return String.Format("{0} ", useraccountcontrol).Trim();
           
        }
        public static implicit operator String(Employee value)
        {
            return value.ToString();
        }

        public Employee()
        {
        }
    }

  

    public class ActiveDirSearch
    {
        public ActiveDirSearch()
        { }

        public Employee SearchUser()
        {

            Employee employee = new Employee();


            try
            {
             
                
               DirectoryEntry entry = new DirectoryEntry("GC://Test", "Test\\Test", "Ld@Test", AuthenticationTypes.Secure);


                
                System.DirectoryServices.DirectorySearcher search = new System.DirectoryServices.DirectorySearcher(entry);
                search.Filter = "(useraccountcontrol=" + "512" + ")";
                SearchResult result = search.FindOne();


                if (result != null)
                {

                    // user exists, cycle through LDAP fields (cn, telephonenumber etc.)

                    ResultPropertyCollection fields = result.Properties;

                    foreach (String ldapField in fields.PropertyNames)
                    {
                        // cycle through objects in each field e.g. group membership
                        // (for many fields there will only be one object such as name)                        
                        foreach (Object myCollection in fields[ldapField])
                        {
                           
                            if (ldapField == "cn")
                                employee.useraccountcontrol = myCollection.ToString();

                        }
                    }

                }

                else
                {
                    return null;
                }
            }

            catch (Exception e)
            {
                throw e;
            }

            return employee;
        }
    }
}

Open in new window


Am not yet tested this one but i have a doubt while return the output,bcoz am going to return bunch of active users.

Does this code will return the value of all the users ?
Sha1395Asked:
Who is Participating?
 
Todd GerbertConnect With a Mentor IT ConsultantCommented:
I think you're wanting something like this (note that UserAccountControl is a set of flags, and I believe simply specifying 512 as a search parameter won't quite work correctly):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.DirectoryServices;

class Program
{
	static void Main()
	{
		DirectorySearcher searcher = new DirectorySearcher();
		searcher.Filter = "(&(objectCategory=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))";

		Console.WriteLine("Active users:");

		foreach (SearchResult result in searcher.FindAll())
			Console.WriteLine(result.GetDirectoryEntry().Properties["sAMAccountName"].Value);

		Console.ReadKey();
	}
}

Open in new window

0
 
Kelvin McDanielSr. Developer/ConsultantCommented:
As written you're only going to get one user.
0
 
Sha1395Author Commented:
Exactly that's what i think so,so i have to use "Find All()" right ?
0
Cloud Class® Course: Microsoft Azure 2017

Azure has a changed a lot since it was originally introduce by adding new services and features. Do you know everything you need to about Azure? This course will teach you about the Azure App Service, monitoring and application insights, DevOps, and Team Services.

 
Sha1395Author Commented:
Hi,

If you could explain little bit about this will help me to understand

(userAccountControl:1.2.840.113556.1.4.803:=2)))


thanks
0
 
Sha1395Author Commented:
No i got it thru MSDN article ,please ignore my previous question.

How can i return the result as an object and am going to call from Windows Application thru button click.
0
 
Todd GerbertIT ConsultantCommented:
Put the directory searching code in it's own method, call that method from your button click event handler.  Easy thing to do would be to simply return the SearchResultCollection:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.DirectoryServices;

public partial class Form1 : Form
{
	public Form1()
	{
		InitializeComponent();
	}

	private void button1_Click(object sender, EventArgs e)
	{
		SearchResultCollection activeUsers = GetActiveUsers();

		activeUserseTextBox.Clear();

		if (activeUsers == null)
			MessageBox.Show("No Active Users Found");
		else
		{
			foreach (SearchResult user in activeUsers)
			{
				activeUserseTextBox.AppendText(user.GetDirectoryEntry().Properties["sAMAccountName"].Value.ToString() + "\r\n");
			}
		}
	}

	private SearchResultCollection GetActiveUsers()
	{
		SearchResultCollection searchResults = null;

		using (DirectorySearcher searcher = new DirectorySearcher())
		{
			searcher.Filter = "(&(objectCategory=person)(sAMAccountName=*)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))";

			searchResults = searcher.FindAll();
		}

		if (searchResults.Count > 0)
			return searchResults;
		else
			return null;
	}
}

Open in new window



Or, you can return an array of strings that has the user names:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.DirectoryServices;

public partial class Form1 : Form
{
	public Form1()
	{
		InitializeComponent();
	}

	private void button1_Click(object sender, EventArgs e)
	{
		string[] activeUsers = GetActiveUsers();

		activeUserseTextBox.Clear();

		if (activeUsers == null)
			MessageBox.Show("No Active Users Found");
		else
		{
			foreach (string user in activeUsers)
				activeUserseTextBox.AppendText(user + Environment.NewLine);
		}
	}

	private string[] GetActiveUsers()
	{
		string[] userList = null;

		using (DirectorySearcher searcher = new DirectorySearcher())
		{
			searcher.Filter = "(&(objectCategory=person)(sAMAccountName=*)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))";

			SearchResultCollection searchResults = searcher.FindAll();

			if (searchResults.Count > 0)
			{
				userList = new string[searchResults.Count];
				for (int i = 0; i < userList.Length; i++)
					userList[i] = searchResults[i].GetDirectoryEntry().Properties["sAMAccountName"].Value.ToString();
			}
		}

		return userList;

	}
}

Open in new window

0
 
Sha1395Author Commented:
Thanks a lot tgerbert.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.