0

我正在使用 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 值......

任何人都可以解决它?

4

1 回答 1

2

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 不是按用户配置,而是按域配置(直到启用细粒度密码策略)

进一步阅读:

于 2012-10-29T17:14:13.633 回答