Imports System
Imports System.Collections
Imports System.DirectoryServices
Imports System.Data
Imports System.Security.Permissions
Imports System.IO
Imports System.Text
<Assembly: SecurityPermission(SecurityAction.RequestMinimum, Unrestricted:=True)>
Namespace Web.Apps.ADInterface
''' <summary>
''' Class to interface with AD and search for new, modified and deleted users.
''' </summary>
Public Class ADSearch
#Region "Private Variables"
Private Shared _gcPath As String = "GC://mydomain.com"
Private Shared _serviceAccountName As String = "Europe\abcsdfs-S"
Private Shared _servicePassword As String = "2$%^&*()"
Private entry As New DirectoryEntry()
#End Region
#Region "Constructor"
Private Sub New()
entry.Path = _gcPath
entry.Username = _serviceAccountName
entry.Password = _servicePassword
End Sub
#End Region
#Region "Methods"
''' <summary>
''' Method to Search for new,Modified and Deleted users
''' </summary>
''' <param name="createdDate"></param>
Public Shared Sub SearchADUsers(ByVal createdDate As DateTime, ByVal path As String)
Dim strFilter As String = String.Empty
Dim strFromDate As String = ToADDateString(Convert.ToDateTime(createdDate))
'Search criteria for fetching users whose account name, mail and distinguished name are not empty and whose entries are changed since the specified date (either created or modified after the specified date)
strFilter += "(&(objectCategory=user)(samAccountName=*)(mail=*)(distinguishedName=*)"
(|(whenChanged>=" + strFromDate + ")(whenCreated>=" + strFromDate + ")))"
ADSearchUsers(strFilter, path)
End Sub
''' <summary>
''' Method to Search for new,Modified and Deleted users
''' </summary>
Public Shared Sub TakeADSnapshot()
Dim filter As String = String.Empty
filter += "(&(objectCategory=user)(samAccountName=*)(mail=*)(distinguishedName=*))"
ADSnapshot(filter, "C:\insert.CSV")
End Sub
''' <summary>
''' Method to Search for new,Modified and Deleted users
''' </summary>
''' <param name="path">CSV file Path</param>
Public Shared Sub TakeADSnapshot(ByVal path As String)
Dim filter As String = String.Empty
filter += "(&(objectCategory=user)(samAccountName=*)(mail=*)(distinguishedName=*))"
ADSnapshot(filter, path)
End Sub
'The function below takes a snapshot of AD users who satisfy the specified criteria and constructs a CSV file out of it, This is done it's the easiest way to move it into a database.
''' <summary>
''' Method to get take an AD snapshot
''' </summary>
''' <param name="filterString">AD Search string</param>
''' <param name="path">Path of CSV file</param>
Private Shared Sub ADSearchUsers(ByVal filterString As String, ByVal path As String)
Dim entry As New DirectoryEntry()
entry.Path = _gcPath
entry.Username = _serviceAccountName
entry.Password = _servicePassword
Dim mySearcher As New DirectorySearcher(entry)
mySearcher.Filter = filterString.ToString()
Dim tw As TextWriter = New StreamWriter(path, True)
mySearcher.PageSize = 10
mySearcher.CacheResults = False
Dim sqlinsert As StringBuilder = Nothing
'Add all properties that need to be fetched
mySearcher.PropertiesToLoad.Add("displayName")
mySearcher.PropertiesToLoad.Add("givenname")
mySearcher.PropertiesToLoad.Add("sn")
mySearcher.PropertiesToLoad.Add("ou")
mySearcher.PropertiesToLoad.Add("employeeType")
mySearcher.PropertiesToLoad.Add("mail")
mySearcher.PropertiesToLoad.Add("telephoneNumber")
mySearcher.PropertiesToLoad.Add("samAccountName")
mySearcher.PropertiesToLoad.Add("whenCreated")
mySearcher.PropertiesToLoad.Add("whenChanged")
mySearcher.PropertiesToLoad.Add("objectGUID")
mySearcher.PropertiesToLoad.Add("c")
'The search scope specifies how deep the search needs to be, it can be either "base"- which means only in the current //level, and "OneLevel" which means the base and one level below and then "subtree"-which means the entire tree needs //to be searched.
mySearcher.SearchScope = SearchScope.Subtree
Dim resultUsers As SearchResultCollection = mySearcher.FindAll()
Dim fpos As Integer, spos As Integer
Dim dn As String, newdn As String, newerdn As String
For Each srUser As SearchResult In resultUsers
Try
Dim de As DirectoryEntry = srUser.GetDirectoryEntry()
Dim arraybyte As Byte() = CByte(de.Properties("objectGUID").Value)
Dim OctetToHexStr As New StringBuilder()
For k As Integer = 0 To arraybyte.Length - 1
OctetToHexStr.Append("\" + Convert.ToString(Convert.ToByte(arraybyte(k)), 16))
Next
dn = de.Properties("distinguishedName")(0).ToString()
sqlinsert = New StringBuilder()
'To get the domain name from Distinguished name
fpos = dn.IndexOf("DC=", 0)
newdn = dn.Substring(fpos, dn.Length - fpos)
spos = newdn.IndexOf(",DC=", 3)
newdn = newdn.Substring(0, spos)
newerdn = newdn.Substring("DC=".Length, newdn.Length - 3)
sqlinsert.Append(OctetToHexStr.ToString())
sqlinsert.Append(";")
sqlinsert.Append(de.Properties("givenname").Value)
sqlinsert.Append(";")
sqlinsert.Append(de.Properties("sn").Value)
sqlinsert.Append(";")
sqlinsert.Append(de.Properties("ou").Value)
sqlinsert.Append(";")
sqlinsert.Append(de.Properties("employeeType").Value)
sqlinsert.Append(";")
sqlinsert.Append(";")
sqlinsert.Append(de.Properties("mail").Value)
sqlinsert.Append(";")
sqlinsert.Append(de.Properties("samAccountName").Value)
sqlinsert.Append(";")
sqlinsert.Append(de.Properties("c").Value)
sqlinsert.Append(";")
sqlinsert.Append(de.Properties("l").Value)
sqlinsert.Append(";")
sqlinsert.Append(Convert.ToDateTime(de.Properties("whenChanged")(0).ToString().TrimEnd()).ToString("dd-MMM-yyyy"))
sqlinsert.Append(";")
sqlinsert.Append(Convert.ToDateTime(de.Properties("whenCreated")(0).ToString().TrimEnd()).ToString("dd-MMM-yyyy"))
sqlinsert.Append(";")
AddressOf
sqlinsert.Append(DateTime.Now.ToString("dd-MMM-yyyy"))
sqlinsert.Append(";")
sqlinsert.Append(newerdn)
sqlinsert.Append(";")
sqlinsert.Append(de.Properties("legacyExchangeDN").Value)
sqlinsert.Append(";")
sqlinsert.Append(de.Properties("distinguishedName").Value)
'sqlinsert = OctetToHexStr+ ";" + de.Properties["givenname"].Value + ";" +
de.Properties("sn").Value(+";" + de.Properties("ou").Value + ";" + de.Properties("employeeType").Value + ";" + +";" + de.Properties("mail").Value + ";" + de.Properties("samAccountName").Value + ";" + de.Properties("c").Value + ";" + de.Properties("l").Value + ";" + Convert.ToDateTime(de.Properties("whenChanged")(0).ToString().TrimEnd()).ToString("dd-MMM-yyyy") + ";" + Convert.ToDateTime(de.Properties("whenCreated")(0).ToString().TrimEnd()).ToString("dd-MMM-yyyy") + ";" + DateTime.Now.ToString("dd-MMM-yyyy") + ";" + newerdn + ";" + de.Properties("legacyExchangeDN").Value + ";" + de.Properties("distinguishedName").Value)
de.Close()
tw.WriteLine(sqlinsert)
sqlinsert.Remove(0, sqlinsert.Length)
Catch
Throw
End Try
Next
tw.Close()
End Sub
#End Region
End Class
End Namespace