Solved

Retrieve active user from Active Directory using C#

Posted on 2011-02-24
7
533 Views
Last Modified: 2012-06-21
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 ?
0
Comment
Question by:Sha1395
  • 4
  • 2
7 Comments
 
LVL 11

Expert Comment

by:azarc3
ID: 34968970
As written you're only going to get one user.
0
 

Author Comment

by:Sha1395
ID: 34969053
Exactly that's what i think so,so i have to use "Find All()" right ?
0
 
LVL 33

Accepted Solution

by:
Todd Gerbert earned 500 total points
ID: 34971406
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
Three Reasons Why Backup is Strategic

Backup is strategic to your business because your data is strategic to your business. Without backup, your business will fail. This white paper explains why it is vital for you to design and immediately execute a backup strategy to protect 100 percent of your data.

 

Author Comment

by:Sha1395
ID: 34975018
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
 

Author Comment

by:Sha1395
ID: 34975298
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
 
LVL 33

Expert Comment

by:Todd Gerbert
ID: 34979783
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
 

Author Comment

by:Sha1395
ID: 34983898
Thanks a lot tgerbert.
0

Featured Post

Netscaler Common Configuration How To guides

If you use NetScaler you will want to see these guides. The NetScaler How To Guides show administrators how to get NetScaler up and configured by providing instructions for common scenarios and some not so common ones.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This article introduced a TextBox that supports transparent background.   Introduction TextBox is the most widely used control component in GUI design. Most GUI controls do not support transparent background and more or less do not have the…
We all know that functional code is the leg that any good program stands on when it comes right down to it, however, if your program lacks a good user interface your product may not have the appeal needed to keep your customers happy. This issue can…
This video shows how to use Hyena, from SystemTools Software, to bulk import 100 user accounts from an external text file. View in 1080p for best video quality.
Nobody understands Phishing better than an anti-spam company. That’s why we are providing Phishing Awareness Training to our customers. According to a report by Verizon, only 3% of targeted users report malicious emails to management. With compan…

810 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