如何使用C ++获取ActiveDirectory中的maxpwdAge属性值?

我正在与AD服务器,我想获得maxpwdAge属性值…

我已经尝试了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值…

任何人都可以解决它?

Solutions Collecting From Web of "如何使用C ++获取ActiveDirectory中的maxpwdAge属性值?"

maxpwdAge不包含在user / contact / person LDAP类中,所以你不能以这种方式检索它。

您需要从对象查询它,而不是用户对象

尝试这个:

 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没有为每个用户配置,而是按照每个域配置(直到启用细粒度的密码策略)

更多读物: