【问题标题】:C# -- Active Directory -- accountExpires property not reading correctlyC# -- Active Directory -- accountExpires 属性读取不正确
【发布时间】:2011-12-23 22:50:38
【问题描述】:

我正在开发一个列出活动目录用户的许多属性的工具。目前,我可以通过向 lastPasswordSet 属性添加 90 天(典型策略)来显示到期日期。但是,有些帐户设置为永不过期。

我做了一些研究,发现如果属性在转换为长整数时等于 9223372036854775807,那么密码永远不会过期(或者我被告知)。

我遇到的问题是,我查找的每个帐户都有 9223372036854775807 作为 accountExpires 值。我有 microsoft AD 工具,可以验证哪些帐户实际上设置为永不过期,哪些帐户在 90 天内过期。我不确定我做错了什么:

    public bool doesPWExpire(string userDN)
    {
        DirectoryEntry ent = new DirectoryEntry(userDN);
        //get account expires property
        LargeInteger passChanged = ent.Properties["accountExpires"].Value as LargeInteger;

        //convert to data type long
        long int64Value = (long)((uint)passChanged.LowPart | (((long)passChanged.HighPart) << 32));

        if (int64Value == 9223372036854775807)
        {
            return false;
        }
        else
        {
            return true;
        }
    }

【问题讨论】:

    标签: c# active-directory passwords


    【解决方案1】:

    你得到了 long.MaxValue,一个“从不”的好值。您的代码不一致,您正在读取“accountExpires”属性但分配给名为“passChanged”的变量。这表明您实际上想要读取与密码相关的属性。像“maxPwdAge”和“PasswordLastChanged”。帐户通常不会过期,密码会。

    【讨论】:

    • 感谢您的回复。这很有意义。你知道有没有其他方法可以确定AD中是否设置了“密码不过期”检查?
    • 你为什么不试试呢?使用不会过期的密码创建一个帐户,查看 maxPwdAge 时返回的内容。
    • 要读取和设置“密码永不过期”,请查看“userAccountControl”属性和 ADS_UF_DONT_EXPIRE_PASSWD
    • 帐户通常不会过期,密码会。 不正确。账号和密码都可以设置失效日期,都可以失效。
    • 请注意“通常”这个词。
    【解决方案2】:

    我想DateTime expiry = DateTime.FromFileTime((int)ent.Properties["accountExpires"].Value) 会帮你搞定的

    【讨论】:

    • 感谢您的回复。我收到此代码的无效强制转换异常。我会继续使用它,但如果您有任何其他想法,请告诉我。
    • 您可能必须将其转换为字符串并调用 int.parse 或尝试转换为 long。我手头没有测试环境。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    相关资源
    最近更新 更多