我正在尝试确定用户是否是AD中的某个成员。但是,以下似乎并不是出于某种原因......
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;”上打破循环。
答案 0 :(得分:4)
你确定该行正在执行吗?也许if
条件永远不会评估为true
。放置一个断点并检查。 ......是的,它应该打破循环。
答案 1 :(得分:4)
奇怪的是,你以递归方式调用this.MemberOf
但忽略了它的结果。也许你的意思是:
if (oGroup.ToString() == sGroup)
{
return true;
}
else
{
bool isMember = this.MemberOf(oGroup.ToString(), sGroup, true);
if (isMember) { return true; }
}
你的返回语句似乎不会退出循环的原因是因为当你以递归方式调用时,循环中的循环内部会出现循环。检查您的调用堆栈 - 您应该注意到MemberOf
多次出现,当您返回时,其中一个消失。通过进行上述更改,它将正确返回,展开堆栈。
答案 2 :(得分:1)
在这一行this.MemberOf(oGroup.ToString(), sGroup, true);
上,您不希望实际上是return this.MemberOf(oGroup.ToString(), sGroup, true);
吗?你以递归方式调用相同的函数,无论函数在递归循环中的计算结果为true还是false,该函数总是返回false。
答案 3 :(得分:1)
return
确实退出了循环(除了一些涉及匿名方法的边缘情况!)。但我更担心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;
}