打对了

宇宙和生命从哪里来?又要到哪里去呢?

 

基于深度优先的递归判断域用户是否是某个组的成员

基于深度优先的递归判断域用户是否是某个组的成员
引用System.DirectoryServices
并导入名称空间
using  System.DirectoryServices;
功能:判断域用户(登录名)是否是某个域安全组的成员,域用户可能属于多个组,并且所属的组可能又属于多个组,所以需要递归调用.

private  DirectoryEntry entry  =   new  DirectoryEntry( " LDAP://domain " , @" domain\username " , " password " );
private   bool  UserisGroupMember( string  UserLogin, string  RoleName)
        
{    
                        
            DirectorySearcher mySearcher 
=   new  DirectorySearcher(entry);
            mySearcher.Filter
= string .Format ( " (&(objectClass=user)(sAMAccountName={0})) " ,UserLogin );
            mySearcher.PropertiesToLoad.Add (
" memberof " );
            SearchResult mysr
= mySearcher.FindOne();            

            
if  (mysr.Properties .Count > 1 // 返回两个属性,一个是内置的adspath,另一个是PropertiesToLoad加载的
             {    
                
string  [] memberof = new   string  [mysr.Properties[ " memberof " ].Count ];
                
int  i = 0 ;
                
foreach ( Object myColl  in  mysr.Properties[ " memberof " ])
                
{
                    memberof[i]
= myColl.ToString ().Substring ( 3 ,myColl.ToString ().IndexOf( " , " ) - 3 );                    
                    
if  (memberof[i] == RoleName)
                        
return   true ;
                    i
++ ;
                }//其实这一层循环是广度优先算法,因为考虑到一个人直接属于某个安全组的可能性要大一些,这样做效率更高.如果把下面这个循环放到上面的if的esle中,就是完全的深度优先了.

                                    
                
foreach  ( string  GroupName  in  memberof)                
                    
if  (MemberisGroupMember(GroupName,RoleName))
                        
return   true ;    
            }

            
return   false ;
        }


        
private   bool  MemberisGroupMember( string  GroupName, string  RoleName)
        
{
            DirectorySearcher mySearcher 
=   new  DirectorySearcher(entry);
            mySearcher.Filter
= string .Format ( " (&(objectClass=group)(CN={0})) " ,GroupName );
            mySearcher.PropertiesToLoad.Add (
" memberof " );
            SearchResult mysr
= mySearcher.FindOne();
            
string  memberof;

            
if  (mysr.Properties.Count  > 1 ) // 返回两个属性,一个是内置的adspath,另一个是PropertiesToLoad加载的
             {
                
foreach ( Object myColl  in  mysr.Properties[ " memberof " ])
                
{
                    memberof
= myColl.ToString ().Substring ( 3 ,myColl.ToString ().IndexOf( " , " ) - 3 );                    
                    
if  (memberof == RoleName)
                        
return   true ;                                            
                    
else
                        
if  (MemberisGroupMember(memberof,RoleName))
                        
return   true ;
                }

            }

            
return   false ;
        }

posted on 2004-11-02 17:21 知道得越多知道的越少 阅读(1510) 评论(1) 编辑 收藏

评论

#1楼[楼主] 2004-11-02 18:20 知道得越多知道的越少      

不知道有没有更好的算法或者实现方式,自我感觉这种方式的性能不高.
例如:
一个人属于10个组,
这10个组中的5个组又有自己的父母组,它的父母组又有自己的父母组,层层递归,一但找到匹配的组名则层层返回

HttpContext.Current.User.Identity.Name只能得到用户登录名,关联的对象不能得到所属组名.
 回复 引用 查看   

导航

统计

公告

对你说打错了 我不是你那个什么
你想找的那个 就算我跟她同名同姓又如何
都说你打错了 我要欺骗你干什么
你们多久没见连 我跟她的声音你都不认得
你怎么样过 什么样的生活 是否难耐寂寞
你到底是谁 总是阴差阳错 擦过我的耳朵
第几次打错了 这是注定还是巧合
谁是玛格列特 她知道你的着急一定很快乐
你们发生什么 还是你欠了她什么
有什么舍不得 她不住这里你却非找她不可
你怎么样过 什么样的生活 是否难耐寂寞
你到底是谁 总是阴差阳错 擦过我的耳朵
你怎么样过 什么样的生活 是否难耐寂寞
你到底是谁 总是阴差阳错 擦过我的耳朵
你们会讲什么口气会不会软软的
你紧张得想哭 多年后想起今天值得不值得
昵称:知道得越多知道的越少
园龄:7年4个月
粉丝:2
关注:0

搜索

 
 

常用链接

我的标签

随笔分类

随笔档案

文章分类

文章档案

音乐

有价值的blog

最新评论

阅读排行榜

评论排行榜

推荐排行榜