62,272
社区成员
发帖
与我相关
我的任务
分享
等待高手、# 假设AD中有一组织单位,给定以下信息:
#
# AD:ms.com
#
# AD管理员:administrator
#
# AD管理员密码:pass@word1
#
# 组织单位名称:XX有限公司(不必理会其下有嵌套多少组织单位,通常都是部门)
#
# 现在要获取这一组织单位下的所有的用户信息,比如只要:帐号,姓名,邮件,所在组织这四个字段,具体实现如示例代码所示:
#
# private const string domainName = "ms.com";
#
# private const string adAdmin = "administrator";
#
# private const string password = "pass@word1";
#
# private const string ouName = "XX有限公司";
#
# private DataTable GetADUsers()
#
# {
#
# DataTable dt = new DataTable();
#
# dt.Columns.Add("sAMAccountName");//帐号
#
# dt.Columns.Add("Name");//姓名
#
# dt.Columns.Add("mail"); //邮箱地址
#
# dt.Columns.Add("OU"); //用户组织
#
# DirectoryEntry adRoot = new DirectoryEntry("LDAP://" + domainName, adAdmin, password, AuthenticationTypes.Secure);
#
# DirectoryEntry ou = adRoot.Children.Find("OU=" + ouName);
#
# DirectorySearcher mySearcher = new DirectorySearcher(ou);
#
# mySearcher.Filter = ("(objectClass=user)"); //user表示用户,group表示组
#
# foreach (System.DirectoryServices.SearchResult resEnt in mySearcher.FindAll())
#
# {
#
# DataRow dr = dt.NewRow();
#
# dr["sAMAccountName"] = string.Empty;
#
# dr["Name"] = string.Empty;
#
# dr["mail"] = string.Empty;
#
# dr["OU"] = string.Empty;
#
# DirectoryEntry user = resEnt.GetDirectoryEntry();
#
# if (user.Properties.Contains("sAMAccountName"))
#
# {
#
# dr["sAMAccountName"] = user.Properties["sAMAccountName"][0].ToString();
#
# }
#
# if (user.Properties.Contains("Name"))
#
# {
#
# dr["Name"] = user.Properties["Name"][0].ToString();
#
# }
#
# if (user.Properties.Contains("mail"))
#
# {
#
# dr["mail"] = user.Properties["mail"][0].ToString();
#
# }
#
# if (user.Parent.Name != string.Empty && user.Parent.Name.IndexOf('=') > -1)
#
# {
#
# //获取用户所在的组织单位
#
# dr["OU"] = user.Parent.Name.Split('=')[1];
#
# }
#
# dt.Rows.Add(dr);
#
# }
#
# return dt;
#
# }
#
# }
#
# 如果想要知道用户信息中都包含哪些字段,可以foreach出来看看
#
# DirectoryEntry user = resEnt.GetDirectoryEntry();
#
# foreach (string property in user.Properties.PropertyNames)
#
# {
#
# Console.WriteLine("字段名: " + property);
#
# }
private string GetNamingContext(string hostName, string userName, string Pwd)
{
using (DirectoryEntry de = new DirectoryEntry())
{
string path = String.Format("LDAP://{0}/rootDSE", hostName);
de.Username = userName;
de.Password = Pwd;
de.Path = path;
return de.Properties["defaultNamingContext"][0].ToString();
}
}
//hostName为域名
public List<User> GetAllUsers(string hostName,string userName,string Pwd)
{
List<User> userList = new List<User>();
using (DirectoryEntry root = new DirectoryEntry())
{
string defaultNamingContext = GetNamingContext(hostName, userName, Pwd);
root.Path = string.Format("LDAP://{0}/{1}", hostName, defaultNamingContext);
root.Username = userName;
root.Password = Pwd;
using (DirectorySearcher searcher = new DirectorySearcher())
{
searcher.SearchRoot = root;
searcher.SearchScope = SearchScope.Subtree;
searcher.Filter = "(&(objectCategory=person)(objectClass=user))";
SearchResultCollection results = searcher.FindAll();
foreach (SearchResult result in results)
{
User user = new User();
user.UserID = result.Properties["sAMAccountName"][0].ToString(); //用户登录名
//某个属性可以取到userGroup,查下MSDN
user.UserName = result.Properties["Name"][0].ToString();//用户姓名
userList.Add(user);
}
}
}
return userList;
}