2012-02-21 2 views
1

약간의 도움을 얻기 위해 일부 전문직을 찾고 있습니다 ... 저는 개발이 아주 쉽습니다. 직장에서 첫 번째 프로젝트. 목표는 (물론 특정 OU (조직 단위)의) 활성 디렉토리에서 필요없는 계정을 자동으로 삭제하는 것입니다. 이 작업을 수행하려면 계정 목록을 가져와야합니다. 이것은 잘 작동합니다. 3 단계 (데이터 액세스, 비즈니스 및 GUI)로 작업하고 있습니다.Active Directory : 특정 조직 단위에 따라 사용자 목록을 얻는 방법

Active Directory에서 OU를 가져 오는 데이터 액세스 계층에 'GetOU'함수를 작성했습니다. 서로 다른 OU는 ComboBox에 나열됩니다. 사용자가 콤보 상자의 OU를 변경하면 선택 값을 다시 가져 와서 데이터 액세스 계층에 전달하여 GetMembers 함수에서 지정한 OU에서 멤버를 선택하고 throw 할 수 있습니다. 다시 DataGrid로 이동합니다. 이 여기 충분히 명확 경우 나도 몰라

내가 쓴 무엇을 지금까지 : 데이터 액세스 :

public static DataTable GetMembers() 
    { 
     DataTable membersDt = new DataTable(); 
     DataSet membersDs = new DataSet(); 
     DataColumn column; 

     column = new DataColumn(); 
     column.ColumnName = "ID"; 
     membersDt.Columns.Add(column); 

     column = new DataColumn(); 
     column.ColumnName = "First Name"; 
     membersDt.Columns.Add(column); 

     column = new DataColumn(); 
     column.ColumnName = "Last Name"; 
     membersDt.Columns.Add(column); 

     column = new DataColumn(); 
     column.ColumnName = "Logon"; 
     membersDt.Columns.Add(column); 

     column = new DataColumn(); 
     column.ColumnName = "ManagerDN"; 
     membersDt.Columns.Add(column); 

     column = new DataColumn(); 
     column.ColumnName = "Logon Manager"; 
     membersDt.Columns.Add(column); 

     membersDs.Tables.Add(membersDt); 

     DataRow row; 
     String dom = "OU=xxx,OU=xxx,DC=xxx,DC=xxx,DC=xxx,DC=xxx"; 
     DirectoryEntry directoryObject = new DirectoryEntry("LDAP://" + dom); 
     int i = 1; 

     foreach (DirectoryEntry child in directoryObject.Children) 
     { 
      row = membersDt.NewRow(); 
      membersDt.Rows.Add(row); 
      row["ID"] = i++; 

      if (child.Properties["givenName"].Value == null) 
      { 
       row["First Name"] += "Group Logon"; 
      } 
      else 
      { 
       row["First Name"] = child.Properties["givenName"].Value.ToString(); 
      } 
      row["Last Name"] = child.Properties["sn"].Value.ToString(); 
      row["Logon"] = child.Properties["sAMAccountName"].Value.ToString(); 

      if (child.Properties["Manager"].Value == null) 
      { 
       row["ManagerDN"] += "Unknown Manager"; 
      } 
      else 
      { 
       row["ManagerDN"] = child.Properties["Manager"].Value.ToString(); 
      } 
      String uManager = row["ManagerDN"].ToString(); 
      DirectoryEntry UserManager = new DirectoryEntry("LDAP://" + uManager); 
      if (child.Properties["Manager"].Value == null) 
      { 
       row["Logon manager"] += "Unknown Manager"; 
      } 
      else 
      { 
       row["Logon Manager"] = UserManager.Properties["sAMAccountName"].Value.ToString(); 
      } 
     } 
     return membersDt; 
    } 

public static DataTable GetOUList() 
    { 
     //Creation du filtre de recherche 
     String dom = "OU=xxx,DC=xxx,DC=xxx,DC=xxx,DC=xxx"; 
     DirectoryEntry directoryObject = new DirectoryEntry("LDAP://" + dom); 
     DirectorySearcher ouSearcher = new DirectorySearcher(directoryObject); 
     ouSearcher.Filter = "(objectClass=OrganizationalUnit)"; 

     //Tri ascendant de la liste sortie 
     SortOption sortedOuList = new SortOption(); 
     sortedOuList.PropertyName = "OU"; 
     sortedOuList.Direction = SortDirection.Ascending; 
     ouSearcher.Sort = sortedOuList; 

     //Recherche des OU présentes dans 'string dom' 
     DataTable OuDt = new DataTable(); 
     DataColumn column; 

     column = new DataColumn(); 
     column.ColumnName = "OuName"; 
     OuDt.Columns.Add(column); 

     DataRow row; 
     foreach (SearchResult result in ouSearcher.FindAll()) 
     { 
      row = OuDt.NewRow(); 
      OuDt.Rows.Add(row); 
      DirectoryEntry dirEntry = result.GetDirectoryEntry(); 
      row["OuName"] = dirEntry.Properties["ou"].Value; 
     } 
     return OuDt; 
    } 

사업 :

public static DataTable GetMembers() 
    { 
     try 
     { 
      return DAL.Classes.DataProvider.GetMembers(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("Error getting MemberList: " + ex.Message.ToString()); 
      throw ex; 
     } 
    } 

public static DataTable GetOu() 
    { 
     try 
     { 
      return DAL.Classes.DataProvider.GetOUList(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("Error getting Ou: " + ex.Message.ToString()); 
      throw ex; 
     } 
    } 

GUI :

private void Form1_Load(object sender, EventArgs e) 
    { 
     //Display des OU dans le combo 
     OuCBox.DataSource = ToBeDeleted.BLL.Classes.MembersManager.GetOu(); 
     OuCBox.DisplayMember = "OuName"; 

    } 

    private void getListBtn_Click(object sender, EventArgs e) 
    { 
     MembersDG.DataSource = ToBeDeleted.BLL.Classes.MembersManager.GetMembers(); 
     MembersDG.Columns["ManagerDN"].Visible = false; 
     MembersDG.Columns["ID"].Width = 35;    
    } 

문자열 'dom'이 완전히 완성되면 memberList를 표시 할 수 있습니다. 내가 원하는 작업은 다음과 같습니다. OuCBox에서 하나의 OU를 선택하면 해당 OU에서 FindAll()을 만들 수 있도록 데이터 액세스 레이어에 값을 반환합니다.

도움을 주셨습니다. 고마워요

답변

-1

OK, 그와 함께 지금은 잘 작동 것 :

string selectedOu = ((System.Data.DataRowView)OuCBox.SelectedValue)).Row.ItemArray[0].ToString(); 

감사합니다!

0

변수를 dom에 추가하십시오. 필터하지 마십시오.

+0

jgauffin을 고맙습니다.하지만 그렇게 할 때 selectedOu 문자열의 값은 system.data.dataRowView입니다. –

관련 문제