Я пытаюсь преобразовать AD maxpwdAge
(64-разрядное целое число) в несколько дней.Функция Perl для отрицательных целых чисел с использованием дополнения 2
Использует
Get
метод интерфейса Iads, чтобы получить значение доменаmaxPwdAge
атрибута (строка 5).Обратите внимание, что мы используем ключевое слово
Set
в VBScript для инициализации переменной с именемobjMaxPwdAge
-переменной, используемой для хранения значения, возвращаемогоGet
. Почему это?Когда вы извлекаете 64-битное большое целое число, ADSI не возвращает одно гигантское скалярное значение. Вместо этого ADSI автоматически возвращает объект
IADsLargeInteger
. Для вычисления значения большого целого используются свойстваIADsLargeInteger
интерфейсаHighPart
иLowPart
. Как вы, возможно, догадались,HighPart
получает 32 разряда высокого порядка, аLowPart
получает младший бит 32 бит. Вы используете следующую формулу для преобразованияHighPart
иLowPart
в значение большого целого.
Существующий код в VBScript с той же страницы:
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
Как я могу это сделать в Perl?
ya .. он будет, но как сгенерировать высокую часть и низкую часть (для ex: значение -37108517437440) – Tree
Я думал, что у вас были высокие и низкие 32-битные части и вы хотели построить исходное 64-битное значение , Что у тебя есть? –
У меня 64-битное целое целое значение: -37108517437440 – Tree