Solved

Retrieve active user from Active Directory using C#

Posted on 2011-02-24
7
529 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
Find Ransomware Secrets With All-Source Analysis

Ransomware has become a major concern for organizations; its prevalence has grown due to past successes achieved by threat actors. While each ransomware variant is different, we’ve seen some common tactics and trends used among the authors of the malware.

 

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

What Security Threats Are You Missing?

Enhance your security with threat intelligence from the web. Get trending threat insights on hackers, exploits, and suspicious IP addresses delivered to your inbox with our free Cyber Daily.

Join & Write a Comment

This article describes a simple method to resize a control at runtime.  It includes ready-to-use source code and a complete sample demonstration application.  We'll also talk about C# Extension Methods. Introduction In one of my applications…
Entity Framework is a powerful tool to help you interact with the DataBase but still doesn't help much when we have a Stored Procedure that returns more than one resultset. The solution takes some of out-of-the-box thinking; read on!
Access reports are powerful and flexible. Learn how to create a query and then a grouped report using the wizard. Modify the report design after the wizard is done to make it look better. There will be another video to explain how to put the final p…
This video gives you a great overview about bandwidth monitoring with SNMP and WMI with our network monitoring solution PRTG Network Monitor (https://www.paessler.com/prtg). If you're looking for how to monitor bandwidth using netflow or packet s…

705 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

18 Experts available now in Live!

Get 1:1 Help Now