关于LDAP 登陆,和获取用户组集合的一些问题.

BillHu233 2015-07-14 11:24:08

这是我做的登陆,在object obj = entry.NativeObject;这一步的时候显示服务器无法操作,在正式服务器上面是可以正常登陆的,但是在本地和测试服务器上面就显示服务器无法操作了,我想请问一下是什么问题.

还有我这边大概需要做一个获取域内所有用户的集合,我想请教一下怎么写代码,求各位路过的大神帮忙解答,谢谢各位了
...全文
654 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
两宙 2015-09-16
  • 打赏
  • 举报
回复
你好,大神,我是来问问题的,java通过ldap取数据,超过1000条就会报错,我知道这是windows限制了,但是该怎么改呢?求教大神。。。
i疾风 2015-07-17
  • 打赏
  • 举报
回复
引用
我顺便问一下,是不是不同公司的searcher.Filter = "(objectClass=account)"; objectClass的值都不一样,有人用account表示用户,有人用Users表示,searcher.PropertiesToLoad.Add("cn");还有这个,cn是不是表示的获取User的哪一个属性?如果我不知道数据库是什么样的我有什么方法可以查询到么?

关于这个,这是肯定的。给你看张图吧。

你看,这就是AD的所有属性,filter上填写的东西,就是AD中的一个属性的值知否满足给定条件。同样,searcher.PropertiesToLoad.Add(“属性名”),是把一个我们需要的属性加载到结果里返回。因为ad属性太多,那么没加载的属性就不返回了。cn确实是其中的一个属性。在我们公司,cn感觉和登录名是一样一样的。
有的公司AD属性设置的全一点,你就可以获得的很舒服,有的公司AD都是随便搞搞,可能email,title 什么的都不填,这就很烦了
如果你看不到那什么数据的话,建议编写一个小程序来测试看能取到什么属性再进行下一步,不然后期的各种逻辑错误会烦不胜烦
i疾风 2015-07-17
  • 打赏
  • 举报
回复
抱歉,这几天没上论坛。今天来刚看到,希望能帮到你~ 这个问题:
引用
我想请问一下那个path,也就是你上面代码上的"LDAP://" + Domain.GetCurrentDomain(),需要用到哪些参数?怎么配
这个指的是域的地址,比如说我的域名为silvers.com 那么 new DirectoryEntry("LDAP://" + Domain.GetCurrentDomain());就是new DirectoryEntry("LDAP://silverstone.com") 这个LDAP是一个协议名,就和网址前为什么加http一样,后面的域名的话倒是有我这么个写法,还有的写法是指定的ou,cn什么的,这个写法没用过,就不乱说了,反正直接加个域名是肯定好使的,亲测。
BillHu233 2015-07-14
  • 打赏
  • 举报
回复
引用 1 楼 qq283426694 的回复:
LDAP登陆没用过,我也不敢妄言。查找AD中的用户信息我给你一个我的代码供参考~
  DirectoryEntry entry = new DirectoryEntry("LDAP://" + Domain.GetCurrentDomain());
                    DirectorySearcher mySearcher = new DirectorySearcher(entry);
                    mySearcher.Filter = "(&(objectClass=user)(displayname=" + user.Name + "))";  //user表示用户,group表示组
                    mySearcher.PropertiesToLoad.Add("userPrincipalName");
                    mySearcher.PropertiesToLoad.Add("department");
                    mySearcher.PropertiesToLoad.Add("mail");
                    mySearcher.PropertiesToLoad.Add("title");
                    try
                    {
                        var result = mySearcher.FindOne();
                        if (result != null)
                        {
                            if (result.Properties.Contains("mail"))
                            {
                                user.Email = result.Properties["mail"][0].ToString();
                            }
                            else
                            {
                                user.Email = "null@null.com";
                            }
                            if (result.Properties.Contains("department"))
                            {
                                Department = result.Properties["department"][0].ToString().ToLower();
                            }
                            if (result.Properties.Contains("title"))
                            {
                                title = result.Properties["title"][0].ToString().ToLower();
                            }
                        }
                    }
                    catch(Exception e)
                    {
                        user.Email = "fail ad search";                        
                        throw;
                    }
                });
我因为个人的需求,在生成DirectoryEntry时不需要提供账号密码,但是跨域查询据我经验来看提供异域的AD用户的账号密码是解决问题的捷径。 Searcher.filter指定的就是在域里搜索的条件。此时因为未设置pagesize,最多只可得到1000条数据,随意设置pagesize后可获取更多数据。个人亲测,设置pagesize=1000,取得6000+条数据。只是我用了这么点而已。 PropertiesToLoad.add添加的是从ad中获取的属性,如果不指定,默认取得adpath属性和一个什么属性(忘记了)。
我顺便问一下,是不是不同公司的searcher.Filter = "(objectClass=account)"; objectClass的值都不一样,有人用account表示用户,有人用Users表示,searcher.PropertiesToLoad.Add("cn");还有这个,cn是不是表示的获取User的哪一个属性?如果我不知道数据库是什么样的我有什么方法可以查询到么?
BillHu233 2015-07-14
  • 打赏
  • 举报
回复
引用 2 楼 qq283426694 的回复:
mysearcher.findone()根据filter条件获取一条记录, findall()获取很多条记录。此时应注意上限
我顺便问一下,是不是不同公司的searcher.Filter = "(objectClass=account)"; objectClass的值都不一样,有人用account表示用户,有人用Users表示,searcher.PropertiesToLoad.Add("cn");还有这个,cn是不是表示的获取User的哪一个属性?如果我不知道数据库是什么样的我有什么方法可以查询到么?
BillHu233 2015-07-14
  • 打赏
  • 举报
回复
引用 1 楼 qq283426694 的回复:
LDAP登陆没用过,我也不敢妄言。查找AD中的用户信息我给你一个我的代码供参考~
  DirectoryEntry entry = new DirectoryEntry("LDAP://" + Domain.GetCurrentDomain());
                    DirectorySearcher mySearcher = new DirectorySearcher(entry);
                    mySearcher.Filter = "(&(objectClass=user)(displayname=" + user.Name + "))";  //user表示用户,group表示组
                    mySearcher.PropertiesToLoad.Add("userPrincipalName");
                    mySearcher.PropertiesToLoad.Add("department");
                    mySearcher.PropertiesToLoad.Add("mail");
                    mySearcher.PropertiesToLoad.Add("title");
                    try
                    {
                        var result = mySearcher.FindOne();
                        if (result != null)
                        {
                            if (result.Properties.Contains("mail"))
                            {
                                user.Email = result.Properties["mail"][0].ToString();
                            }
                            else
                            {
                                user.Email = "null@null.com";
                            }
                            if (result.Properties.Contains("department"))
                            {
                                Department = result.Properties["department"][0].ToString().ToLower();
                            }
                            if (result.Properties.Contains("title"))
                            {
                                title = result.Properties["title"][0].ToString().ToLower();
                            }
                        }
                    }
                    catch(Exception e)
                    {
                        user.Email = "fail ad search";                        
                        throw;
                    }
                });
我因为个人的需求,在生成DirectoryEntry时不需要提供账号密码,但是跨域查询据我经验来看提供异域的AD用户的账号密码是解决问题的捷径。 Searcher.filter指定的就是在域里搜索的条件。此时因为未设置pagesize,最多只可得到1000条数据,随意设置pagesize后可获取更多数据。个人亲测,设置pagesize=1000,取得6000+条数据。只是我用了这么点而已。 PropertiesToLoad.add添加的是从ad中获取的属性,如果不指定,默认取得adpath属性和一个什么属性(忘记了)。
我想请问一下那个path,也就是你上面代码上的"LDAP://" + Domain.GetCurrentDomain(),需要用到哪些参数?怎么配.
i疾风 2015-07-14
  • 打赏
  • 举报
回复
mysearcher.findone()根据filter条件获取一条记录, findall()获取很多条记录。此时应注意上限
i疾风 2015-07-14
  • 打赏
  • 举报
回复
LDAP登陆没用过,我也不敢妄言。查找AD中的用户信息我给你一个我的代码供参考~
  DirectoryEntry entry = new DirectoryEntry("LDAP://" + Domain.GetCurrentDomain());
                    DirectorySearcher mySearcher = new DirectorySearcher(entry);
                    mySearcher.Filter = "(&(objectClass=user)(displayname=" + user.Name + "))";  //user表示用户,group表示组
                    mySearcher.PropertiesToLoad.Add("userPrincipalName");
                    mySearcher.PropertiesToLoad.Add("department");
                    mySearcher.PropertiesToLoad.Add("mail");
                    mySearcher.PropertiesToLoad.Add("title");
                    try
                    {
                        var result = mySearcher.FindOne();
                        if (result != null)
                        {
                            if (result.Properties.Contains("mail"))
                            {
                                user.Email = result.Properties["mail"][0].ToString();
                            }
                            else
                            {
                                user.Email = "null@null.com";
                            }
                            if (result.Properties.Contains("department"))
                            {
                                Department = result.Properties["department"][0].ToString().ToLower();
                            }
                            if (result.Properties.Contains("title"))
                            {
                                title = result.Properties["title"][0].ToString().ToLower();
                            }
                        }
                    }
                    catch(Exception e)
                    {
                        user.Email = "fail ad search";                        
                        throw;
                    }
                });
我因为个人的需求,在生成DirectoryEntry时不需要提供账号密码,但是跨域查询据我经验来看提供异域的AD用户的账号密码是解决问题的捷径。 Searcher.filter指定的就是在域里搜索的条件。此时因为未设置pagesize,最多只可得到1000条数据,随意设置pagesize后可获取更多数据。个人亲测,设置pagesize=1000,取得6000+条数据。只是我用了这么点而已。 PropertiesToLoad.add添加的是从ad中获取的属性,如果不指定,默认取得adpath属性和一个什么属性(忘记了)。

111,120

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧