我正在努力导出一个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;
}
}
}
如果有人看到问题出在哪里,请告诉我!任何,所有的帮助将不胜感激!提前谢谢。
答案 0 :(得分:0)
DirectorySearcher每个查询不能返回超过1000个结果。请查看以下答案以获取解决方法:
Can I get more than 1000 records from a DirectorySearcher in Asp.Net?
至于在字段周围添加引号,请查看以下答案:
答案 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"]);
}
这似乎解决了那些可能一直在努力解决问题的人的问题。