为了账号安全,请及时绑定邮箱和手机立即绑定

在 AD 组中获取用户的电子邮件

在 AD 组中获取用户的电子邮件

C#
梵蒂冈之花 2021-11-07 19:12:55
我正在使用此代码获取 AD 中特定组中的用户列表private DirectoryEntry _directoryEntry = null;private DirectoryEntry SearchRoot{    get    {        if (_directoryEntry == null)        {            _directoryEntry = new DirectoryEntry(_ldapDomain, _user, PBKDF2Algorithm.Decrypt(_password, "PAssword"), AuthenticationTypes.Secure);        }        return _directoryEntry;    }}public List<User> GetUserFromGroup(String groupName){    List<User> userlist = new List<User>();    try    {        DirectorySearcher directorySearch = new DirectorySearcher(SearchRoot)        {            Filter = "(&(objectClass=group)(SAMAccountName=" + groupName + "))"        };        var results = directorySearch.FindOne();        if (results != null)        {            DirectoryEntry deGroup = new DirectoryEntry(results.Path, _user, PBKDF2Algorithm.Decrypt(_password, "PAssword"));            PropertyCollection pColl = deGroup.Properties;            int count = pColl["member"].Count;            for (int i = 0; i < count; i++)            {                string respath = results.Path;                string[] pathnavigate = respath.Split("CN".ToCharArray());                respath = pathnavigate[0];                string objpath = pColl["member"][i].ToString();                string path = respath + objpath;                DirectoryEntry user = new DirectoryEntry(path, _user, PBKDF2Algorithm.Decrypt(_password, "!twcActiveDirectory!"));                User userobj = User.GetUser(user);                userlist.Add(userobj);                user.Close();            }        }        return userlist.Where(item => !string.IsNullOrEmpty(item.FirstName) || !string.IsNullOrWhiteSpace(item.FirstName)).ToList();    }    catch (Exception ex)    {        return userlist;    }}返回的属性不包含用户的电子邮件地址,后来我找到了一种检索用户代理地址的方法,这正是我正在寻找的,但问题是我只成功检索了主根中的用户,而不是为一个特定的群体。那么,有什么方法可以合并两个代码?
查看完整描述

1 回答

?
慕村9548890

TA贡献1884条经验 获得超4个赞

我找到了一种方法,如下所示:

  1. 为每个组加载用户

  2. 为每个用户建立登录名

  3. 使用 PrincipalContext 搜索每个用户的登录名

  4. 为每个用户加载 ProxyAddresses 和 Mail 属性

这是一个解释这个想法的代码:

    DirectoryEntry _directoryEntry = null;



private DirectoryEntry SearchRoot

        {

            get

            {

                if (_directoryEntry == null)

                {

                    _directoryEntry = new DirectoryEntry(@"LDAP://" + textBox5.Text, textBox3.Text, textBox4.Text, AuthenticationTypes.Secure);

                }

                return _directoryEntry;

            }

        }

private void GetUsers(){

  List<string> userlist = new List<string>();


            try

            {

                DirectorySearcher directorySearch = new DirectorySearcher(SearchRoot)

                {

                    Filter = "(&(objectClass=group)(SAMAccountName=" + textBox1.Text + "))"

                };



                directorySearch.PropertiesToLoad.Add("mail");

                var results = directorySearch.FindOne();


                if (results != null)

                {



                    DirectoryEntry deGroup = new DirectoryEntry(results.Path, textBox3.Text, textBox4.Text);


                    System.DirectoryServices.PropertyCollection pColl = deGroup.Properties;

                    int count = pColl["member"].Count;

                    for (int i = 0; i < count; i++)

                    {

                        string respath = results.Path;

                        string[] pathnavigate = respath.Split("CN".ToCharArray());

                        respath = pathnavigate[0];

                        string objpath = pColl["member"][i].ToString();

                        string path = respath + objpath;

                        DirectoryEntry user = new DirectoryEntry(path, textBox3.Text, textBox4.Text);

                        User userobj = User.GetUser(user);

                        userobj.EmailAddress = GetUserEmail(userobj.LoginName);

                        userlist.Add(userobj.EmailAddress);

                        user.Close();

                    }

                }

                //listBox1.DataSource = userlist;

                userlist.ForEach(item => textBox2.Text += item);

                //var t = userlist.Where(item => !string.IsNullOrEmpty(item.FirstName) || !string.IsNullOrWhiteSpace(item.FirstName)).ToList();

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.Message + ex.InnerException + ex.StackTrace + ex.Source);

            }

}

  public string GetUserEmail(string usr)

        {

            try

            {


                string uid = textBox3.Text;

                string pwd = textBox4.Text;

                string emailProxy = "";

                string emailMail = "";

                using (var context = new PrincipalContext(ContextType.Domain, textBox5.Text, uid, pwd))

                {

                    using (UserPrincipal user = new UserPrincipal(context))

                    {

                        user.SamAccountName = usr;


                        using (var searcher = new PrincipalSearcher(user))

                        {


                            var r = searcher.FindAll();

                            foreach (var result in r)

                            {

                                DirectoryEntry de = result.GetUnderlyingObject() as DirectoryEntry;


                                if (de.Properties["proxyAddresses"].Value != null)

                                {

                                    List<string> tmpAddress = new List<string>();

                                    int i = 0;

                                    while (true)

                                    {

                                        try

                                        {

                                            tmpAddress.Add(de.Properties["proxyAddresses"][i].ToString());

                                            i++;

                                        }

                                        catch { break; }

                                    }

                                    string val = tmpAddress.Where(em => em.Contains("SMTP")).FirstOrDefault();


                                    if (!string.IsNullOrEmpty(val))

                                        emailProxy = val.Split(':')[1];

                                    else emailProxy = "";

                                }

                                else emailProxy = "";


                                if (de.Properties["mail"].Value != null)

                                    emailMail = de.Properties["mail"].Value.ToString();

                                else emailMail = "";

                            }

                        }

                    }

                }


                return !string.IsNullOrEmpty(emailProxy) ? emailProxy : (!string.IsNullOrEmpty(emailMail) ? emailMail : "");


            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.Message + ex.InnerException + ex.StackTrace + ex.Source);

                return "";

            }

        }


查看完整回答
反对 回复 2021-11-07
  • 1 回答
  • 0 关注
  • 441 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信