【问题标题】:How to get maxpwdAge attribute value in ActiveDirectory using C++?如何使用 C++ 在 ActiveDirectory 中获取 maxpwdAge 属性值?
【发布时间】:2012-10-29 13:59:00
【问题描述】:

我正在使用 AD 服务器,我想获取 ma​​xpwdAge 属性 值...

我已经为此尝试了 ADSi,但它给出了一个问题。

VARIANT var;
bsNamingContext=L"maxpwdAge";

hr = ADsGetObject(pszADsPath, IID_IADsUser, (void**) &pUser);
if(SUCCEEDED(hr))
{
VariantInit(&var);
hr = pUser->Get(bsNamingContext, &var);  
}

但是,它给出 -2147463155 (8000500d) 错误...

但我正在使用bsNamingContext=L"cn"; 它正确地给出了 CN 值...

谁能解决?

【问题讨论】:

    标签: c++ windows winapi active-directory


    【解决方案1】:

    maxpwdAge 不包含在用户/联系人/个人 LDAP 类中,因此您无法通过这种方式检索它。

    您需要从 domain 对象查询它,而不是 user 对象

    试试这个:

    Const ONE_HUNDRED_NANOSECOND = .000000100   ' .000000100 is equal to 10^-7
    Const SECONDS_IN_DAY = 86400
    
    Set objDomain = GetObject("LDAP://DC=fabrikam,DC=com")     ' LINE 4
    Set objMaxPwdAge = objDomain.Get("maxPwdAge")              ' LINE 5
    
    If objMaxPwdAge.LowPart = 0 Then
      WScript.Echo "The Maximum Password Age is set to 0 in the " & _
                   "domain. Therefore, the password does not expire."
      WScript.Quit
    Else
      dblMaxPwdNano = Abs(objMaxPwdAge.HighPart * 2^32 + objMaxPwdAge.LowPart)
      dblMaxPwdSecs = dblMaxPwdNano * ONE_HUNDRED_NANOSECOND   ' LINE 13
      dblMaxPwdDays = Int(dblMaxPwdSecs / SECONDS_IN_DAY)      ' LINE 14
      WScript.Echo "Maximum password age: " & dblMaxPwdDays & " days"
    End If
    

    更新:

    要将大整数转换为人类可读的值,请使用IADsLargeInteger调度接口

    注意 1:示例是用 VB 编写的,但您可以轻松地重写它,因为有 COM。

    注意 2:maxpwdAge 不是按用户配置,而是按域配置(直到启用细粒度密码策略)

    进一步阅读:

    【讨论】:

    • @rkosegi,我的问题得到了解决方案...但我还有一个疑问.. mypwdage 值为 432000...而我的 pwdlastsetvalue 为 41208.467858796299...现在如何转换将此时间值转换为日值...如何使用 C++ win32 API 获取密码到期日?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    相关资源
    最近更新 更多