2010-06-14 32 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