public static List <IDictionary <string, Object> > GetLdapQuery(System.Net.NetworkCredential cred, string OUName, string domainController, string domain, string filter, bool ldaps = false) { var ActiveDirectoryObjects = new List <IDictionary <string, Object> >(); if (String.IsNullOrEmpty(domainController)) { domainController = Networking.GetDCName(domain); //if domain is null, this will try to find a DC in current user's domain } if (String.IsNullOrEmpty(domainController)) { Console.WriteLine("[X] Unable to retrieve the domain information, try again with '/domain'."); return(null); } if (ldaps) { LdapConnection ldapConnection = null; SearchResponse response = null; List <SearchResultEntry> result = new List <SearchResultEntry>(); // perhaps make this dynamic? int maxResultsToRequest = 1000; try { var serverId = new LdapDirectoryIdentifier(domainController, 636); ldapConnection = new LdapConnection(serverId, cred); ldapConnection.SessionOptions.SecureSocketLayer = true; ldapConnection.SessionOptions.VerifyServerCertificate += delegate { return(true); }; ldapConnection.Bind(); } catch (Exception ex) { if (ex.InnerException != null) { Console.WriteLine("[X] Error binding to LDAP server: {0}", ex.InnerException.Message); } else { Console.WriteLine("[X] Error binding to LDAP server: {0}", ex.Message); } return(null); } if (String.IsNullOrEmpty(OUName)) { OUName = String.Format("DC={0}", domain.Replace(".", ",DC=")); } try { Console.WriteLine("[*] Searching path '{0}' for '{1}'", OUName, filter); PageResultRequestControl pageRequestControl = new PageResultRequestControl(maxResultsToRequest); PageResultResponseControl pageResponseControl; SearchRequest request = new SearchRequest(OUName, filter, SearchScope.Subtree, null); request.Controls.Add(pageRequestControl); while (true) { response = (SearchResponse)ldapConnection.SendRequest(request); foreach (SearchResultEntry entry in response.Entries) { result.Add(entry); } pageResponseControl = (PageResultResponseControl)response.Controls[0]; if (pageResponseControl.Cookie.Length == 0) { break; } pageRequestControl.Cookie = pageResponseControl.Cookie; } } catch (Exception ex) { Console.WriteLine("[X] Error executing LDAP query: {0}", ex.Message); } if (response.ResultCode == ResultCode.Success) { ActiveDirectoryObjects = Helpers.GetADObjects(result); } } else { DirectoryEntry directoryObject = null; DirectorySearcher searcher = null; try { directoryObject = Networking.GetLdapSearchRoot(cred, OUName, domainController, domain); searcher = new DirectorySearcher(directoryObject); // enable LDAP paged search to get all results, by pages of 1000 items searcher.PageSize = 1000; } catch (Exception ex) { if (ex.InnerException != null) { Console.WriteLine("[X] Error creating the domain searcher: {0}", ex.InnerException.Message); } else { Console.WriteLine("[X] Error creating the domain searcher: {0}", ex.Message); } return(null); } // check to ensure that the bind worked correctly try { string dirPath = directoryObject.Path; if (String.IsNullOrEmpty(dirPath)) { Console.WriteLine("[*] Searching the current domain for '{0}'", filter); } else { Console.WriteLine("[*] Searching path '{0}' for '{1}'", dirPath, filter); } } catch (DirectoryServicesCOMException ex) { if (!String.IsNullOrEmpty(OUName)) { Console.WriteLine("\r\n[X] Error validating the domain searcher for bind path \"{0}\" : {1}", OUName, ex.Message); } else { Console.WriteLine("\r\n[X] Error validating the domain searcher: {0}", ex.Message); } return(null); } try { searcher.Filter = filter; } catch (Exception ex) { Console.WriteLine("[X] Error settings the domain searcher filter: {0}", ex.InnerException.Message); return(null); } SearchResultCollection results = null; try { results = searcher.FindAll(); if (results.Count == 0) { Console.WriteLine("[X] No results returned by LDAP!"); return(null); } } catch (Exception ex) { if (ex.InnerException != null) { Console.WriteLine("[X] Error executing the domain searcher: {0}", ex.InnerException.Message); } else { Console.WriteLine("[X] Error executing the domain searcher: {0}", ex.Message); } return(null); } ActiveDirectoryObjects = Helpers.GetADObjects(results); } return(ActiveDirectoryObjects); }