2010-06-14 83 views
2

我试图确定用户是否是AD组的成员,或者不在AD中。但是,以下似乎并不奏效出于某种原因...return not breaking loop(c#)

public bool MemberOf(string sObjectName, string sGroup, bool bIsGroup) 
{ 
    DirectoryEntry dEntry = CreateDirectoryEntry(); 
    DirectorySearcher dSearcher = new DirectorySearcher(dEntry); 
    if (bIsGroup) dSearcher.Filter = "(distinguishedName=" + sObjectName + ")"; 
    else dSearcher.Filter = "(&(sAMAccountName=" + sObjectName + ")(objectClass=user))"; 
    SearchResult sResult = dSearcher.FindOne(); 
    if (sResult != null) 
    { 
     foreach (object oGroup in sResult.Properties["MemberOf"]) 
     { 
      if (oGroup.ToString() == sGroup) return true; 
      else this.MemberOf(oGroup.ToString(), sGroup, true); 
     } 
    } 
    return false; 
} 

另一个变化:http://users.business.uconn.edu/dwick/work/wtf/6-14-2010%201-15-15%20PM.png

也不起作用。这似乎是一个非常愚蠢的问题......但不应该打破“回归真实”的循环。

回答

4

奇怪的是,你递归地调用this.MemberOf,但忽略它的结果。也许你的意思是这样的:

if (oGroup.ToString() == sGroup) 
{ 
    return true; 
} 
else 
{ 
    bool isMember = this.MemberOf(oGroup.ToString(), sGroup, true); 
    if (isMember) { return true; } 
} 

为什么你的回报statment可能会出现不退出循环,因为当你调用递归你有环路内循环回路内的原因。检查你的呼叫堆栈 - 你应该注意到MemberOf多次出现,当你返回其中一个消失。通过进行上述更改,它将正确返回,展开堆栈。

+0

+1 ...很好。 – 2010-06-14 17:25:33

4

您确定该行正在执行吗?也许if条件从不计算为true。放置一个断点并检查。 ...是的,它应该打破循环。

+0

另外值得一提的是字符串比较是区分大小写的默认。 – 2010-06-14 17:23:26

+0

将返回放在单独的行中将使您可以执行此操作并使代码更具可读性。 E.g.如果(条件)换行符{换行符语句换行符}换行符换行换行符{换行符语句换行符}换行符 – 2010-06-14 17:25:53

+0

@丹尼,您不需要在不同行上返回来设置断点。只需点击return并按F9(假设你有标准的C#绑定) – 2010-06-14 17:28:17

1

在这条线路上this.MemberOf(oGroup.ToString(), sGroup, true);,难道你不想要那return this.MemberOf(oGroup.ToString(), sGroup, true);?你正在递归地调用同一个函数,并且无论该函数在递归循环内是否为真或假,函数总是返回false。

+0

可以有多层嵌套,所以你不只是想立即返回 – 2010-06-14 17:52:16

1

A return确实退出循环(除了涉及anon-methods的一些边缘情况!)。但我更担心的是else

else this.MemberOf(oGroup.ToString(), sGroup, true); 

做你的意思做更多的东西一样:

else if (this.MemberOf(oGroup.ToString(), sGroup, true)) return true; 

注意;如果是这样你可以整理这:

if (oGroup.ToString() == sGroup || 
     this.MemberOf(oGroup.ToString(), sGroup, true)) { 
    return true; 
} 
+0

也正确,ty – 2010-06-14 17:42:02