C#将Active Directory导出为CSV以包含所有用户&包括逗号

时间:2015-07-13 16:03:27

标签: c# .net csv active-directory

我正在努力导出一个CSV文件,其中包含我公司的Active Directory用户列表。我希望CSV文件显示每个用户的员工ID,姓名,电子邮件和电话号码。虽然我能够生成CSV文件中的用户列表,但我遇到了两个问题: 1)CSV文件似乎只输出了1,000个用户的列表(虽然应该更接近3,000个用户)和 2)我无法弄清楚如何识别其中包含逗号的值以保留在一列中,而不会被推送到下一个。例如,某些员工姓名在该字段中有逗号。我希望它被读作(|表示分栏符):

123456 |约翰史密斯,ABC | jsmith@company.org | (123)456-7890

而不是:

123456 |约翰史密斯| ABC | jsmith@company.org | (123)456-7890

我知道后一个问题,它涉及在字段周围添加引号" name",但我不知道该怎么做或它属于哪里。这是我的代码

    //creates a data table for Active Directory information
    public void AD_Table()
    {
        // **Query all of the users within the AD**            
        DirectoryEntry de = new DirectoryEntry(ConnectToDomain());
        SearchResultCollection results;
        DirectorySearcher ds = null;

        ds = new DirectorySearcher(de);
        ds.PropertiesToLoad.Add("employeeID");
        ds.PropertiesToLoad.Add("name");
        ds.PropertiesToLoad.Add("mail");
        ds.PropertiesToLoad.Add("telephoneNumber");

        //filters out inactive or invalid employee user accounts
        ds.Filter = "(&(objectCategory=person)(objectClass=user)(employeeID>= 000001)(employeeID<= 999999))";
        results = ds.FindAll();



        //header columns for Data Table
        DataTable dt = new DataTable();
        dt.Columns.Add("Employee ID", typeof(string));
        dt.Columns.Add("Full Name", typeof(string));
        dt.Columns.Add("Office Email", typeof(string));
        dt.Columns.Add("Office Phone", typeof(string));


        foreach (SearchResult sr in results)
        {
            DataRow dr = dt.NewRow();
            DirectoryEntry entry = sr.GetDirectoryEntry();
            if (entry.Properties["employeeID"].Count > 0)
                dr["Employee ID"] = entry.Properties["employeeID"].Value.ToString();
            if (entry.Properties["name"].Count > 0)
                dr["Full Name"] = entry.Properties["name"].Value.ToString();
            if (entry.Properties["mail"].Count > 0)
                dr["Office Email"] = entry.Properties["mail"].Value.ToString();
            if (entry.Properties["telephoneNumber"].Count > 0)
                dr["Office Phone"] = entry.Properties["telephoneNumber"].Value.ToString();
            dt.Rows.Add(dr);
        }

        string fullFilePath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"\\LSSUpdaterVM\AD\Update\ADWorkEmailPhone.csv");
        //move datatable into CSV
        CreateCSVFile(dt, fullFilePath);

    }


    //creating the CSV file with the AD user info
    public void CreateCSVFile(DataTable dt, string strPath)
    {
        try
        {
            StreamWriter sw = new StreamWriter(strPath, false);
            int columnCount = dt.Columns.Count;
            for (int i = 0; i < columnCount; i++)
            {
                sw.Write(dt.Columns[i]);
                if (i < columnCount - 1)
                {
                    sw.Write(",");
                }
            }
            sw.Write(sw.NewLine);

            foreach (DataRow dr in dt.Rows)
            {
                for (int i = 0; i < columnCount; i++)
                {
                    if (!Convert.IsDBNull(dr[i]))
                    {
                        sw.Write(dr[i].ToString());
                    }
                    if (i < columnCount - 1)
                    {
                        sw.Write(",");
                    }
                }
                sw.Write(sw.NewLine);
            }
            sw.Close();
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

}

如果有人看到问题出在哪里,请告诉我!任何,所有的帮助将不胜感激!提前谢谢。

2 个答案:

答案 0 :(得分:0)

DirectorySearcher每个查询不能返回超过1000个结果。请查看以下答案以获取解决方法:

Can I get more than 1000 records from a DirectorySearcher in Asp.Net?

至于在字段周围添加引号,请查看以下答案:

how to use comma in csv columns

答案 1 :(得分:0)

通过更改foreach下的代码(搜索结果中的SearchResult sr),我能够通过名称列中的逗号更正问题

            if (entry.Properties["name"].Count > 0)
            {
                dr["Full Name"] = entry.Properties["name"].Value.ToString();
                    dr["Full Name"] = string.Format("\"{0}\"", dr["Full Name"]);
            }

这似乎解决了那些可能一直在努力解决问题的人的问题。