2009-09-02 10 views
1

私はADのすべての部門を読み込んで、その部門が属する各企業のxmlファイルとして保存する小さなアプリケーションを作成しました。しかし、私はまた、各部門のユーザーがメンバーであるすべてのグループを追加する必要があります。C#Active Directoryの各部門からグループのリストを取得する方法

私のコードが生成するxmlファイルのスニペットです。私は各部門ノードに子としてグループを追加したいと思います。

<departments> 
    <department name="Administrasjon"> 
    <group></group> 
    </department> 
    <department name="Barnehage"> 
    <group></group> 
    </department> 
    <department name="Bibliotek"> 
    <group></group> 
    </department> 
    <department name="Frivilligsentralen"> 
    <group></group> 
    </department> 
</departmets> 

これを生成して保存するコードを以下に示します。私が欲しいものを手に入れることは可能ですか? ご協力いただければ幸いです。

static void Main(string[] args) 
     { 
      ArrayList companies = new ArrayList(); 
      companies = GetCompaniesFromAD(); 
      for (int i = 0; i < companies.Count; i++) 
      { 
       GetCompanyAndDepAndCreateXML(companies[i].ToString()); 
      }     
     } 

     public static ArrayList GetCompaniesFromAD() 
     {   
      string path = "LDAP://myserver/OU=Brukere,OU=Felles,DC=bla,DC=bla,DC=bla"; 


      DirectoryEntry entry = new DirectoryEntry(path); 
      ArrayList companies = new ArrayList(); 
      string sFilter = String.Format("(&(objectCategory=Person)(objectClass=user)(company=*))"); 
      string[] attribs = new string[] { "department", "company" }; 

      using (DirectorySearcher dirsearcher = new DirectorySearcher(entry,sFilter,attribs)) 
      {     
       foreach (SearchResult sResult in dirsearcher.FindAll()) 
       { 
        StringBuilder companyNames = new StringBuilder(); 

        if(sResult.Properties.Contains("company")) 
        { 
         foreach (object o in sResult.Properties["company"]) 
         { 
          companyNames.AppendFormat("{0}", o); 
          companies.Add(o.ToString());        
         }       
        } //end if "company      

       } //end foreach     
      } //end using.. 



      ArrayList companyNoDuplicates = new ArrayList(); 
      companyNoDuplicates = RemoveDuplicates(companies); 
      return companyNoDuplicates; 
      } 

     public static void GetCompanyAndDepAndCreateXML(string companyName) 
     { 
      string path = "LDAP://myserver/OU=Brukere,OU=Felles,DC=bla,DC=bla,DC=bla"; 


      DirectoryEntry entry = new DirectoryEntry(path);    
      ArrayList departments = new ArrayList(); 
      string sFilter = String.Format("(&(objectCategory=Person)(objectClass=user)(company=" + companyName + "))"); 
      string[] attribs = new string[] { "department" }; 

      using (DirectorySearcher dirsearcher = new DirectorySearcher(entry, sFilter, attribs)) 
      { 
       foreach (SearchResult sResult in dirsearcher.FindAll()) 
       {      
        StringBuilder departmentNames = new StringBuilder();      

        if (sResult.Properties.Contains("department")) 
        { 
         foreach (object o in sResult.Properties["department"]) 
         { 
          departmentNames.AppendFormat("{0}", o); 
          departments.Add(o.ToString());        
         } 
        } //end if department 
       } //end foreach     
      } //end using.. 


      ArrayList departmentNoDuplicates = new ArrayList(); 
      departmentNoDuplicates = RemoveDuplicates(departments);       

      generateXmlDoc(departmentNoDuplicates, companyName); 
     } 

     public static void generateXmlDoc(ArrayList departments, string companyName) 
     { 
      XElement xml = new XElement("departments"); 
      for (int i = 0; i < departments.Count; i++) 
      { 
       XElement node = new XElement("department", 
        new XAttribute("name", departments[i].ToString()), 
        new XElement("group", "") 
        ); 
       xml.Add(node); 
      } 
      xml.Save(companyName + ".xml"); 

     } 

     public static ArrayList RemoveDuplicates(ArrayList items) 
     { 
      ArrayList noDuplicates = new ArrayList(); 
      foreach (string strItem in items) 
      { 
       if (!noDuplicates.Contains(strItem.Trim())) 
       { 
        noDuplicates.Add(strItem.Trim()); 
       } 
      } 
      noDuplicates.Sort(); 

      return noDuplicates; 
     } 
+1

.NET 3.5の場合、なぜまだArrayListを使用していますか?それはsooooooの.NET 1.xです! :-)リストを代わりに使用する - タイプセーフであるという利点もあります - アルマジロオブジェクトを企業のリストに追加することはできません;-) –

答えて

2

これは、あなたのタスクを達成するために、より直感的であるとして、あなたがSystem.DirectoryServices.AccountManagementを使用する場合に実装する方がはるかに簡単になるだろう。

+0

私はそれについて読んでいません。私はADと全く新しい仕事をしています。しかし、System.DirectoryServices.AccountManagementを使用して目標を達成することは可能ですか? –

2

"SCMcDonnell"と言いますと、.NET 3.5以降であれば、間違いなくS.DS.AccountManagement名前空間を使用してください。

MSDNに新しい名前空間について説明した優れた記事を見つける - Joe KaplanとEthan Wilanskyは、新しい機能と使い方を説明してくれました。

マーク

+0

はい、私は.NET 3.5を使用しています。私は記事とGoogleをちょっと読んでいます。あなたは私が後にしているものと同様のコードを見たことがありますか? –

+0

いいえ、具体的なものではありませんが、私が思い出す限り、列挙と検索は改善の領域の1つです。したがって、最後にS.DS.AMを使って少し楽にすることができます –

関連する問題