Как получить значение атрибута maxpwdAge в ActiveDirectory с помощью C++?
Я работаю с сервером AD, я хочу получить значение атрибута maxpwdAge...
Я уже пробовал AD Si для этого, но это дает проблему.
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 правильно...
Кто-нибудь может решить это?
2 ответа
maxpwdAge не включен в класс 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 настраивается не для пользователя, а для домена (до тех пор, пока не будут включены детальные политики паролей)
Дальнейшие чтения:
Я тоже боролся с этим. В конце концов, я смог получить его по следующим критериям.
baseDN: 'DC=myofficedomain,DC=local',
filter: '(objectClass=domain)',
attributes: ['maxPwdAge']
Я надеюсь, что это поможет всем, кто использует ldapsearch или NodeJS с ActiveDirectory.