.net 3.5 c# bool设置不正确
本文关键字:设置 不正确 bool net | 更新日期: 2023-09-27 17:49:22
我有一些c#代码,试图使用提供的计算机名进行LDAP搜索,以确定计算机帐户是否被禁用。大部分代码取自这个SO问题。示例链接中的代码工作得很好,如果我在AD中禁用帐户,在活跃的计算机上正确显示为真。问题是我不能完全按照最初呈现的方式使用代码,它必须按照我粘贴在下面的方式使用。下面的代码的问题是,它总是返回false,它似乎并不重要你传递给它的计算机名称。我也意识到foreach循环可能是不必要的,因为我只是想找到一台计算机。
using System;
using System.DirectoryServices;
namespace DynamicNamespace
{
public class DynamicClass
{
public System.Boolean DynamicMethod(System.Boolean IsDisabled, System.String ComputerName)
{
//the string should be your a DC(domain controller)
const string ldap = "LDAP://server-name";
//DirectoryEntry is used for manipulating objects (users, computers)
DirectoryEntry entry = new DirectoryEntry(ldap);
//DirectorySearcher responds to a filter method for LDAP searches
//http://www.tek-tips.com/faqs.cfm?fid=5667 has a decent query guide
DirectorySearcher dSearch = new DirectorySearcher(entry);
//SAM Account Name was showing a $ sign at one point, using * for wildcard
dSearch.Filter = String.Format("samAccountName={0}*", ComputerName);
dSearch.PropertiesToLoad.Add("samAccountName");
dSearch.PropertiesToLoad.Add("userAccountControl");
SearchResultCollection results = dSearch.FindAll();
foreach (SearchResult result in results)
{
int userAccountControl = Convert.ToInt32(result.Properties["userAccountControl"][0]);
string samAccountName = Convert.ToString(result.Properties["samAccountName"][0]);
bool disabled = ((userAccountControl & 2) > 0);
if (disabled == false)
{
IsDisabled = false;
}
else
{
IsDisabled = true;
}
}
return IsDisabled;
}
}
}
您可能会收到多个搜索结果,并且由于您使用循环,IsDisabled
将被分配多次。
根据你评论中的链接,你正在做部分匹配:
PARTIAL MATCH......................(attribute={partial value}*)
如果提供的计算机名是准确的,为什么不使用:
EQUALITY...........................(attribute=value)
然后你可以删除循环:
dSearch.Filter = String.Format("(samAccountName={0})", ComputerName);
dSearch.PropertiesToLoad.Add("samAccountName");
dSearch.PropertiesToLoad.Add("userAccountControl");
SearchResult result = dSearch.FindOne();
bool disabled = (result != null) && ((userAccountControl & 2) > 0);
您应该通过调试器来确认这一点,但是如果您在调用此函数时将false
作为第一个参数传递并且搜索没有得到任何结果,那么您的函数将返回您通过IsDisabled
传递的相同的false
值。
你的代码没有任何问题,唯一的问题是你没有区分如果帐户不存在,如果它存在但被禁用。
您可以执行以下操作来检测帐户是否不存在,您正在执行for循环并不重要,因为就像您说的那样,它只执行一次,但如果您想将其更改为以下…(你必须改变它,以满足它可以返回超过1个结果的事实,因为你有一个*在你的搜索过滤器)
SearchResultCollection results = dSearch.FindAll();
if (results.Count == 0)
throw new Exception("Account not found.");
else if (results.Count == 1)
{
SearchResult result = results[0];
int userAccountControl = Convert.ToInt32(result.Properties["userAccountControl"][0]);
string samAccountName = Convert.ToString(result.Properties["samAccountName"][0]);
bool disabled = ((userAccountControl & 2) > 0);
if (disabled == false)
{ IsDisabled = false; }
else { IsDisabled = true; }
}
else
throw new Exception("More than 1 result found, please filter");
try
{
bool res = dc.DynamicMethod(false, "Username");
}
catch (Exception ex)
{
if (ex.Message == "Account not found.")
{
//Do Something
}
else
throw ex;
}
显然你可以用更合适的东西来代替抛出异常…