2014-01-30 4 views
0

Я работаю над получением значений из Active Directory из задачи сценария в C# (3.5 framework) в SSIS. Код для этого, похоже, работает нормально. Я использую вложенный цикл с внешними циклами, которые не являются многозначными и вставляют их в таблицу с хранимой процедурой, а затем передают PK этой строки, которая будет использоваться как FK во втором цикле на второй хранимую процедуру, которая вставляет все группы, к которым принадлежит пользователь во второй таблице.Значения полей описания Active Directory не отображаются

Моя проблема: я не могу получить какие-либо значения из того, что, по моему мнению, должно быть полем Description, в котором должно содержаться описание каждой отдельной группы. Если я пройду через него и проверит количество объектов описания, он покажет 0. Используя тот же код, чтобы проверить количество Memberof, я получаю количество групп, к которым принадлежит пользователь. Другая часть, которую я не понимаю, я получаю значения из поля Description во внешнем цикле, но это ближе к комментариям пользовательской записи, а не к описаниям отдельных групп. Как будто мой Description не является многозначным. Но кто-то еще может подтвердить через портал AD, что поле Description имеет значения, которые описывают, что каждая группа. Я немного в тупике. См. Код ниже.

DirectoryEntry entry = new DirectoryEntry("LDAP:[my address]"); 
DirectorySearcher Dsearch = new DirectorySearcher(entry); 
Dsearch.Filter = "(&(objectClass=User))"; 

foreach (SearchResult sResultSet in Dsearch.FindAll()) 
{ 
    (code continues from original post) 

    using (SqlConnection dataConnection = new SqlConnection([mysqlconnection])) 
    { 
     using (SqlCommand dataCommand = dataConnection.CreateCommand()) 
     { 
      dataCommand.CommandText = "ActiveDirectory.InsertParentRecords"; 
      dataCommand.CommandType = CommandType.StoredProcedure; 

      dataCommand.Parameters.AddWithValue("@PackageLogId", Dts.Variables["PackageLogId"].Value.ToString()); 
      dataCommand.Parameters.AddWithValue("@cn", GetProperty(sResultSet, "cn")); 
      dataCommand.Parameters.AddWithValue("@givenName", GetProperty(sResultSet, "givenName")); 
      dataCommand.Parameters.AddWithValue("@initials", GetProperty(sResultSet, "initials")); 
      dataCommand.Parameters.AddWithValue("@sn", GetProperty(sResultSet, "sn")); 

      dataCommand.Parameters.AddWithValue("@mail", GetProperty(sResultSet, "mail")); 
      dataCommand.Parameters.AddWithValue("@Name", GetProperty(sResultSet, "Name")); 
      dataCommand.Parameters.AddWithValue("@middleName", GetProperty(sResultSet, "middleName")); 
      dataCommand.Parameters.AddWithValue("@title", GetProperty(sResultSet, "title")); 
      dataCommand.Parameters.AddWithValue("@employeeID", GetProperty(sResultSet, "employeeID")); 

      dataCommand.Parameters.AddWithValue("@employeeNumber", GetProperty(sResultSet, "employeeNumber")); 
      dataCommand.Parameters.AddWithValue("@objectSid", ConvertSidToString((byte[])sResultSet.Properties["objectSid"][0])); 
      dataCommand.Parameters.AddWithValue("@userAccountControl", tempuserAccountControl); 
      dataCommand.Parameters.AddWithValue("@whenCreated", GetProperty(sResultSet, "whenCreated")); 
      dataCommand.Parameters.AddWithValue("@distinguishedName", GetProperty(sResultSet, "distinguishedName")); 

      dataCommand.Parameters.AddWithValue("@badPasswordTime", Convert.ToString(badPasswordTime)); //Issues!! 
      dataCommand.Parameters.AddWithValue("@badPwdCount", GetProperty(sResultSet, "badPwdCount")); 
      dataCommand.Parameters.AddWithValue("@memberof", GetProperty(sResultSet, "memberof")); 
      dataCommand.Parameters.AddWithValue("@samaccountname", GetProperty(sResultSet, "samaccountname")); 
      dataCommand.Parameters.AddWithValue("@Description", GetProperty(sResultSet, "Description")); 

      dataCommand.Parameters.AddWithValue("@maxPwdAge", GetProperty(sResultSet, "maxPwdAge")); //Issues!!        
      dataCommand.Parameters.AddWithValue("@pwdLastSet", pwdLastSet); //Issues!! 
      dataCommand.Parameters.AddWithValue("@LockOutTime", Convert.ToString(LockOutTime));  //Issues!! 

      if (disabled == false) //Issues!! 
       dataCommand.Parameters.AddWithValue("@Acctdisabled", '0'); 
      else 
       dataCommand.Parameters.AddWithValue("@Acctdisabled", '1'); 

      dataCommand.Parameters.AddWithValue("@displayname", GetProperty(sResultSet, "displayname")); 

      dataCommand.Parameters.AddWithValue("@twofactor", twofactor); 
      dataCommand.Parameters.AddWithValue("@skiprecord", skiprecord); 

      dataCommand.Parameters.Add("@DetailID", SqlDbType.Int); 
      dataCommand.Parameters["@DetailID"].Direction = ParameterDirection.Output; 

      dataConnection.Open(); 
      dataCommand.ExecuteScalar(); 
      dataConnection.Close(); 

      Counter++; 
      DetailID = (int)dataCommand.Parameters["@DetailID"].Value; 
     } 
    } 

    using (SqlConnection dataConnection = new SqlConnection[mysqlconnection])) 
    { 
     using (SqlCommand dataCommand = dataConnection.CreateCommand()) 
     { 
      dataConnection.Open(); 

      int groupCount = sResultSet.Properties["memberOf"].Count; 
      int DescriptionCount = sResultSet.Properties["Description"].Count; 

      for (int counter = 0; counter < groupCount; counter++) 
      { 
       dataCommand.CommandText = "ActiveDirectory.InsertMemberOf"; 
       dataCommand.CommandType = CommandType.StoredProcedure; 

       dataCommand.Parameters.Clear(); 
       dataCommand.Parameters.AddWithValue("@PackageLogId", Dts.Variables["PackageLogId"].Value.ToString()); 
       dataCommand.Parameters.AddWithValue("@DetailID", DetailID); 

       if (sResultSet.Properties.Contains("Description")) 
       { 
        dataCommand.Parameters.AddWithValue("@Group", sResultSet.Properties["Description"][counter].ToString()); 
       } 
       else 
       { 
        dataCommand.Parameters.AddWithValue("@Group", "n/a"); 
       }        

       dataCommand.Parameters.AddWithValue("@memberOf", sResultSet.Properties["memberOf"][counter]); 

       dataCommand.ExecuteScalar(); 
       InnerCounter++; 
      } 
     } //End of DataCommand 
    } //End of Data Connection 


    Debug.WriteLine(GetProperty(sResultSet, "displayname") + " " + Counter + ", " + InnerCounter + ", " + GetProperty(sResultSet, "userAccountControl")); 
    InnerCounter = 0;       
    } //End of For Each Loop 
+0

Добавлен код, показывающий, как sResultSet заполняется в edit, @billinkc –

+0

Можете ли вы подключиться к ADSI Edit http://technet.microsoft.com/en-us/library/cc773354(v=ws.10).aspx и убедитесь, что в этой области? –

+0

Я еще не пробовал (не на работе), но у меня есть кто-то, кто прошел через AD Portal, чтобы проверить, что описание на имя группы –

ответ

1

LDAP Поисковый запрос немного похож на запрос SQL, я знаю, что это не четко документированы, но вы бы лучше объявить свойства, которые вы хотите быть retrived поиском. Вы пытаетесь добавить

DirectorySearcher Dsearch = new DirectorySearcher(entry); 
... 
Dsearch.PropertiesToLoad.Add("description"); 
... 
Dsearch.Filter = "(&(objectClass=User))"; 

В моем коде я действительно добавляю все необходимые свойства. Я согласен, что он работает без этого большую часть времени, но просто в большинстве случаев.

Смежные вопросы