Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Active Directory似乎返回缓存的信息_C#_Active Directory - Fatal编程技术网

C# Active Directory似乎返回缓存的信息

C# Active Directory似乎返回缓存的信息,c#,active-directory,C#,Active Directory,我们有一个内部windows控制台应用程序,用于更新Active Directory。此应用程序已成功运行数年 最近,我的任务是添加代码来禁用超过90天未登录系统的用户 代码似乎工作正常,只是每次应用程序运行时都会出现一些用户 以下是搜索代码: public SearchResultCollection SearchAD(string szSearchOU, string szSearchArg, string szObjectClass) { if (szSearchOU ==

我们有一个内部windows控制台应用程序,用于更新Active Directory。此应用程序已成功运行数年

最近,我的任务是添加代码来禁用超过90天未登录系统的用户

代码似乎工作正常,只是每次应用程序运行时都会出现一些用户

以下是搜索代码:

public SearchResultCollection SearchAD(string szSearchOU, string szSearchArg, string szObjectClass)
{
        if (szSearchOU == "")
        {
            ds.SearchRoot = c_DirectoryEntry;
        }
        else
        {
            if (!szSearchOU.StartsWith("LDAP://"))
            {
                szSearchOU = "LDAP://" + szSearchOU;
            }
            ds.SearchRoot = new DirectoryEntry(szSearchOU);
        }

        string szFilter = "";
        if (szObjectClass == "")
            szFilter = "(objectClass=user)";
        else
            szFilter = "(objectClass=" + szObjectClass + ")";
        if (szSearchArg != "")
        {
            if (szSearchArg.Substring(0, 3) != "CN=")
                szSearchArg = "CN=" + szSearchArg;
            szFilter = "(&" + szFilter + "(" + szSearchArg + "))";
        }
        else
            ds.PageSize = 1001;
        ds.Filter = szFilter;
        SearchResultCollection results = ds.FindAll();
        return results;
 }
此方法在整个应用程序中都使用,因此我可以合理地确定它工作正常

以下是调用搜索并对其进行处理的存根:

SearchResultCollection src = SearchADUsers(szOU, "");
clsDisableLog.WriteLog("Processing: " + src.Count.ToString());
foreach (SearchResult r in src)
{
    DirectoryEntry deUser = r.GetDirectoryEntry();
    if (c_Debug)
        clsDisableLog.WriteLog("Processing: " + deUser.Name + " Path: " + deUser.Path.ToString());
    PropertyCollection userAttribs = deUser.Properties;
    int flags = (int)deUser.Properties["userAccountControl"].Value;
    if (!Convert.ToBoolean((flags & UF_DISABLED) == UF_DISABLED))
    {
        bool bDisableAccount = false;
        DateTime dLastLogon = GetLastLogon(deUser);
        if (dLastLogon != DateTime.MinValue)
        {
            TimeSpan diff = DateTime.Now - dLastLogon;
            int iDaysSince = diff.Days;
            if (iDaysSince > iDays)
            {
                clsDisableLog.WriteLog("\t" + deUser.Name);
                clsDisableLog.WriteLog("\t\t" + "Has not logged in for " + iDaysSince.ToString() + " days.");
                clsDisableLog.WriteLog("\t\t" + "Last logon date: " + dLastLogon.ToLongDateString() + " " + dLastLogon.ToLongTimeString());
                clsDisableLog.WriteLog("\t\t" + deUser.Path.ToString());
                bDisableAccount = true;
            }
        }
        else
        {
            clsDisableLog.WriteLog("\t" + deUser.Name);
            clsDisableLog.WriteLog("\t\t" + "Has never logged into domain.");
            clsDisableLog.WriteLog("\t\t" + "Created: " + deUser.Properties["whenCreated"].Value.ToString());
            clsDisableLog.WriteLog("\t\t" + deUser.Path.ToString());
            iAccountsNoLogin++;
        }
        if (bDisableAccount)
        {
            if (deUser.Path.Contains("UtilityAccounts"))
            {
                bDisableAccount = false;
                clsDisableLog.WriteLog("\t\t" + "NOT Disabling Utility Account: " + deUser.Name);
            }
            else
            {
                if (UpdateUserFlag(deUser, UF_DISABLED, true))
                {
                    clsDisableLog.WriteLog("\t\t" + "Disabled");
                    iAccountsDisabled++;
                }
                else
                    clsDisableLog.WriteLog("Error disabling " + deUser.Name);
                if (deUser.Path.ToString().ToLower() != deInactiveOU.Path.ToLower())
                {
                    if (MoveUser(deUser, deInactiveOU))
                    {
                        clsDisableLog.WriteLog("\t\t" + "Moved to: " + deInactiveOU.Name);
                        iAccountsMoved++;
                    }
                    else
                        clsDisableLog.WriteLog("Error moving " + deUser.Name + " to " + deInactiveOU.Name);
                }
            }
        }
    }
每次应用程序运行时都会处理大约14个帐户

例如:

    2/25/2014 12:56:27 PM:  CN=XXXXXXXX
    2/25/2014 12:56:27 PM:      Has not logged in for 252 days.
    2/25/2014 12:56:27 PM:      Last logon date: Tuesday, June 18, 2013 10:14:45 AM
    2/25/2014 12:56:27 PM:      LDAP://CN=XXXXXXXX,OU=XXXX User Accounts,DC=XXXXXXXX,DC=LOCAL
    2/25/2014 12:56:27 PM:      Disabled
    2/25/2014 12:56:27 PM:      Moved to: OU=Inactive
应用程序运行后,此帐户处于OU=Inactive状态并被禁用;但是,如果我重新运行应用程序,用户会再次出现,与此处完全相同

有什么建议吗

我已经设置了DS.CacheResults=false,但是如果我这样做,循环将永远不会执行

谢谢, 约翰

根据一个答案,我已经发布了存根中调用的方法的代码——尽管它们与问题无关,因为我已经确认它们在必要时起作用。这些帐户将被禁用,并移动到相关OU

问题不在于代码没有执行它应该执行的操作-而是AD发现用户帐户未被禁用且不在OU中,即使我可以使用Active Directory用户和计算机进行确认

约翰为什么这样做

if (!Convert.ToBoolean((flags & UF_DISABLED) == UF_DISABLED))
这已经是一个布尔值:

(flags & UF_DISABLED) == UF_DISABLED
除此之外,很难说清楚,因为存根所做的只是调用尚未发布代码的方法


另外,您可能遇到的一个问题与以下事实有关:
lastlogin
active directory属性是特定于域控制器的,它不会被复制,因此您必须检查域中的每个域控制器,以查看上次登录日期。

@John无需粗鲁,LastLogonTimeStamp甚至更糟糕,因为如果您使用默认域配置读取信息,它会落后于实时9-14天。请参阅。@John检查
UF_DISABLED
(应该是
0x2
)和
int flags=(int)deUser.Properties[“userAccountControl”]的值返回正确的值,因为给定结果输出,问题必须存在。const int UF_DISABLED=0x0002;根据目的是:预期用途,请务必注意lastLogontimeStamp属性的预期用途是帮助识别非活动计算机和用户帐户。lastLogon属性不是为提供实时登录信息而设计的。使用默认设置,lastLogontimeStamp将比当前日期晚9-14天。-这正是我们试图使用它的目的。同样,问题不在于该帐户没有被删除或移动-这两者都在发生。此外,我们在广告中有1600多个账户,其中只有14个出现了这种症状。这是一个合法的问题,我在谷歌上反复搜索,结果为零。
(flags & UF_DISABLED) == UF_DISABLED