2010-06-14 2 views
2

Я пытаюсь определить, является ли пользователь членом группы или нет в AD. Однако, как представляется, не следующий работать по какой-то причине ...return not break 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

Не работает. Это кажется действительно глупым вопросом ... но не должен ли он прерывать цикл на «return true»?

ответ

4

Странно, что вы вызываете this.MemberOf рекурсивно, но игнорируете его результат. Возможно, вы имели в виду это:

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

Причина, почему ваше возвращение Постулаты может оказаться не для выхода из цикла происходит потому, что при вызове рекурсивно у вас есть петли внутри петли внутри петли. Проверьте свой стек вызовов - вы должны заметить, что MemberOf появляется несколько раз, и когда вы возвращаете один из них, исчезает. Сделав вышеуказанное изменение, он вернется правильно, разворачивая стек.

+0

+1 ... хороший улов. –

4

Вы уверены, что линия исполняет? Возможно, состояние if никогда не оценивается до true. Поместите контрольную точку и проверьте. ... и да, он должен сломать цикл.

+0

Также стоит отметить, что сравнение строк по умолчанию зависит от регистра. –

+0

Включение возврата на отдельной строке позволит вам сделать это И сделать код более читаемым. . if (condition) newline {newline statement newline} newline else newline {newline statement newline} newline –

+0

@ Danny, вам не нужен возврат на другую строку, чтобы установить точку останова. Просто нажмите на return и нажмите F9 (при условии, что у вас есть стандартные привязки C#) –

1

В этой строке this.MemberOf(oGroup.ToString(), sGroup, true);, разве вы не хотите, чтобы это было на самом деле return this.MemberOf(oGroup.ToString(), sGroup, true);? Вы вызываете ту же функцию рекурсивно, и независимо от того, выполняет ли функция в true или false внутри рекурсивного цикла, функция всегда возвращает false.

+0

может быть несколько слоев вложенности, поэтому вы не просто хотите сразу его вернуть –

1

A return действительно выходит из цикла (за исключением некоторых кромочных дел с использованием anon-методов!). Но я больше беспокоюсь о 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

Также верно, –