0
Reply

LDAP query to AD errors out

Karissa

Karissa

Jul 30 2007 12:15 PM
2.3k

I am currently working on a program that pulls all of the users in our organization and lists their samaccountname, displayname, etc.  We have approximately 55000 users; however, everytime I run the query on the whole organization, at some point I get the error "Object on server not found."  Sometimes the query will run in its entirety, sometimes it will fail about 5000 in, sometimes it will fail 40000 in.  I can't figure out why or how to stop it.  Any suggestions? I'm a novice programmer and am stumped.  I have spent hours searching forums and websites.  Please see code below:


private static string _path = "LDAP://DC=DOMAIN,DC=net";
private static string _serviceAccountName = @"domain\userid";
private static string _servicePassword = "********";
private DirectoryEntry entry = new DirectoryEntry();
private string filterString = "(&(mailnickname=*)(msExchHomeServerName=*))";

 

#region GetMSXUsers 
  public void GetMSXUsers()    
  {  
  
   int i = 0;   //to keep track of arrays
   int j = 0;   //to keep track of deprov array
   string serverParse = "";
   string dn = "";

   try
    {
     
     string homemdb="";
     

     entry.Path = _path;
     entry.Username = _serviceAccountName;
     entry.Password = _servicePassword;
    

     DirectorySearcher mySearcher = new DirectorySearcher(entry);
     mySearcher.Filter = filterString.ToString();
     mySearcher.PageSize = 1000;
     mySearcher.PropertyNamesOnly = true;
     
     //Add all properties that need to be fetched    
     mySearcher.PropertiesToLoad.Add("samAccountName"); ;
     mySearcher.PropertiesToLoad.Add("displayName");        
     mySearcher.PropertiesToLoad.Add("ITBillcc");
     mySearcher.PropertiesToLoad.Add("mDBOverQuotaLimit");
     mySearcher.PropertiesToLoad.Add("homemdb");
     mySearcher.PropertiesToLoad.Add("msExchHomeServerName");
    
     //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;
     SearchResultCollection resultUsers = mySearcher.FindAll();
     int temp = 0;
     temp = resultUsers.Count;
     temp=0;

     foreach (SearchResult srUser in resultUsers)  //get LDAP query results
     {
      DirectoryEntry de = srUser.GetDirectoryEntry();
      dn = de.Properties["distinguishedName"][0].ToString();

      if (dn.IndexOf("DE-PROV")!= -1)
      {
       DeProv[j,0] = de.Properties["samAccountName"][0].ToString().ToLower();
       DeProv[j,1] = de.Properties["displayName"][0].ToString().ToLower();
       j++;
       deProvCnt++;
      }
      else if ((dn.IndexOf("DE-PROV")== -1) && (dn.IndexOf("SystemMailbox")== -1))
      {
       ADUser[i,0] = de.Properties["samAccountName"][0].ToString().ToLower();
       ADUser[i,1] = de.Properties["displayName"][0].ToString();
           
       if (de.Properties.Contains("ITBillcc"))
       { ADUser[i,2] = de.Properties["ITBillcc"][0].ToString(); }
       else
       { ADUser[i,2] = "NONE LISTED"; }
      
       if (de.Properties.Contains("mDBOverQuotaLimit"))
       { ADUser[i,3] = de.Properties["mDBOverQuotaLimit"][0].ToString(); }
       else
       {
        homemdb = de.Properties["homeMDB"][0].ToString().ToLower();

        if ((homemdb.IndexOf("400")!= -1) || (homemdb.IndexOf("3 (do not use-jaexmb2-it")!= -1))
        { ADUser[i,3]="375000";  }
        else if ((homemdb.IndexOf("unrestricted")!= -1) || (homemdb.IndexOf("(hoexmbx1")!= -1))
        { ADUser[i,3] = "1000000"; }
        else
        { ADUser[i,3] = "125000";  }      
       }

       if (de.Properties.Contains("msExchHomeServerName"))
       {
        int index=0;
        serverParse = de.Properties["msExchHomeServerName"][0].ToString().ToLower();
        index = serverParse.IndexOf("/cn=servers/cn=");
        index = index + 15;
        ADUser[i,5] = serverParse.Substring(index).ToUpper();       
       }
       else
       { ADUser[i,5] = "NONE LISTED"; }

       
       i = i + 1;
       userCount= userCount + 1;
      }
     
      temp++;
      de.Close();

     }

     mySearcher.Dispose();
     entry.Close();

    }
   
    catch (Exception e) //catch connection error
    { 
     string errorMessage = "Message: " + e.Message;
     metricsLog.Log((int)LL.Min, "GetUsers", "1", "Error", errorMessage, dn, "", "F", "", "", "");
     return;
    }    
   
  }
  #endregion