.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;
        }
    }
}

.net 3.5 c# bool设置不正确

您可能会收到多个搜索结果,并且由于您使用循环,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;
}

显然你可以用更合适的东西来代替抛出异常…