Скрипты: Как узнать время последнего изменения пароля пользователей в AD?

  • Автор темы diSmiSS
  • 7793
  • Обновлено
  • 29, Dec 2004
  • #1
Тут решил на досуге перевести пару статеек, которые могут быть полезными, и решение которых не всегда лежит на поверхности или затруднено их ручное выполнение. Если подобные вещи покажуться интересными могу продолжить.

Все зависит от Вашего желания.

А для примера возьмем задачу которая возникает когда у нас не установлено время действия паролей в AD. В ручную перепысывать время последнего изменения паролей пользователей неудобно поэтому возник следующий вопрос:
.
Q: Как узнать время последнего изменения пароля пользователей в AD? A: Создаем фалик с именем last_password_change.vbs и копируем туда следующее:
 Option Explicit

Dim strLdapPath, objConnection, objChild

Dim lngTZBias, objUser, objPwdLastSet

Dim objShell, lngBiasKey, k

' Check that all required arguments have been passed

If Wscript.Arguments.Count < 1 Then

Wscript.Echo "Arguments required. For example:" & vbCrLf _

& "cscript last_password_change.vbs ou=test,dc=demo"

Wscript.Quit(0)

End If

strLdapPath = Wscript.Arguments(0)

' Obtain local Time Zone bias from machine registry.

Set objShell = CreateObject("Wscript.Shell")

lngBiasKey = objShell.RegRead("HKLM\System\CurrentControlSet\Control\"_

& "TimeZoneInformation\ActiveTimeBias")

If UCase(TypeName(lngBiasKey)) = "LONG" Then

lngTZBias = lngBiasKey

ElseIf UCase(TypeName(lngBiasKey)) = "VARIANT()" Then

lngTZBias = 0

For k = 0 To UBound(lngBiasKey)

lngTZBias = lngTZBias + (lngBiasKey(k) * 256^k)

Next

End If

Set objConnection = GetObject("LDAP://" & strLdapPath)

objConnection.Filter = Array("user")

For Each objChild In objConnection

Set objPwdLastSet = objChild.pwdLastSet

WScript.Echo objChild.Name & vbTab & _

Integer8Date(objPwdLastSet, lngTZBias)

Next

Wscript.Echo "Operation Completed"

Function Integer8Date(objDate, lngBias)

' Function to convert Integer8 (64-bit) value to a date, adjusted for

' local time zone bias.

Dim lngAdjust, lngDate, lngHigh, lngLow

lngAdjust = lngBias

lngHigh = objDate.HighPart

lngLow = objdate.LowPart

' Account for error in IADslargeInteger property methods.

If lngLow < 0 Then

lngHigh = lngHigh + 1

End If

If (lngHigh = 0) And (lngLow = 0) Then

lngAdjust = 0

End If

lngDate = #1/1/1601# + (((lngHigh * (2 ^ 32)) _

+ lngLow) / 600000000 - lngAdjust) / 1440

' Trap error if lngDate is ridiculously huge.

On Error Resume Next

Integer8Date = CDate(lngDate)

If Err.Number <> 0 Then

On Error GoTo 0

Integer8Date = #1/1/1601#

End If

On Error GoTo 0

End Function
Сохраняем и закрываем. Теперь запускаем shell. И запускаем созданный файл со следующими параметрами:
 cscript last_password_change.vbs ou=test_object,dc=test_domain
где
  • ou=test_object - наименование Organizational Unit (например Users, Computers и т.д.)
  • dc=test_domain - название домена


В итоге shell выдаст подобный список такой список:
 
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.
CN=User1 10/1/2002 4:26:53 PM
CN=User2 9/13/2004 8:55:17 AM
CN=User3 10/2/2002 3:50:50 PM
Operation Completed
Вот и все . Жду откликов. PS Тем кто хочет побороться за копирайты ниже привожу автора. Повторюсь, что я лишь перевел небольшую часть и выложил здесь.
.
' Copyright by John Savill
' This is based on Richard Mueller's script on Interger8Date
' conversion, which is copyrighted as below.
' Copyright (c) 2003 Richard L. Mueller
' Hilltop Lab Web site - _http://www.rlmueller.net

diSmiSS


Рег
28 Nov, 2003

Тем
2

Постов
23

Баллов
43
  • 29, Dec 2004
  • #2
diSmiSS:
Тут решил на досуге перевести пару статеек, которые могут быть полезными, и решение которых не всегда лежит на поверхности или затруднено их ручное выполнение.
Если подобные вещи покажуться интересными могу продолжить. Все зависит от Вашего желания....
Отлично! А главное, полезно. Может, создать отдельную тему?
 

Dredd2000


Рег
14 Oct, 2004

Тем
0

Постов
2

Баллов
2
  • 29, Dec 2004
  • #3
Отлично! А главное, полезно. Может, создать отдельную тему?
Помойму она и так отдельная . Если ты имел ввиду создать тему и пихать туда все что найдеться то потом сложно будет найти . К тому же поиском и так ни кто не пользуется. Поэтому отдельные вопросы буду создавать в новых темах (если найдуться еще заинтересованные лица ). А все темы по этому поводу можно будет найти в каталоге тем.
 

diSmiSS


Рег
28 Nov, 2003

Тем
2

Постов
23

Баллов
43
  • 27, Jul 2006
  • #4
Active Directory является LDAP-совместимой реализацией службы каталогов, а всякая запись в каталоге LDAP состоит из одного или нескольких атрибутов и обладает уникальным именем (DN — англ.

Distinguished Name). Уникальное имя состоит из одного или нескольких относительных уникальных имен (RDN — англ.

Relative Distinguished Name), разделённых запятой.

Относительное уникальное имя имеет вид имяАтрибута=значение.

Уникальное имя может выглядеть, например, следующим образом: «cn=Иван Петров, ou=Сотрудники, dc=example, dc=com». На одном уровне каталога не может существовать двух записей с одинаковыми относительными уникальными именами.

Так, о чем это я Ага Как правило, домены Active Directory именуются с использованием имен DNS, поэтому имя домена AD в общем случае состоит из нескольких уровней, разделенных точкой.

Например ИМЯ_ДОМЕНА.COM. Так как скрипт использует LDAP-запрос к AD, в параметрах скрипта нужно точно указывать полное имя домена, как (dc=ИМЯ_ДОМЕНА,dc=COM) В примере, если test_domain=ИМЯ_ДОМЕНА.COM cscript last_password_change.vbs ou=test_object,dc=test_domain использовать как cscript last_password_change.vbs ou=test_object,dc=ИМЯ_ДОМЕНА,dc=COM
 

okun


Рег
03 May, 2005

Тем
3

Постов
61

Баллов
91
  • 27, Mar 2007
  • #5
вопрос вдогонку
Q: Как узнать время последнего изменения пароля пользователей в AD?


Отлично работает, глючит правда с русскими буквами, например если имя группы "Пользователи портала".

Возник другой вопрос:

Q: Как узнать время окондания действия пароля пользователей в AD?

Т.е. пусть пароль действует 42 дня, как изменить скрипт, чтобы показал когда пользователю настанет время сменить пароль или уже просрочено время?
 

htym


Рег
22 Apr, 2004

Тем
0

Постов
2

Баллов
2
  • 28, Mar 2007
  • #6
Можно использовать класс Win32_UserAccount и его свойство PasswordExpires
С мелкософтовского сайта

можно забрать инструмент Scriptomatic, который поможет вам немного автоматизировать процесс написания скриптов и ориентироваться в свойствах классов. Также можно воспользоваться обалденным инструментом того же мелкософта WMI Code Creator

А TechNet Script Center Sample Scripts

содержит огромное количество образцов скриптов, которыми можно пользоваться в готовом виде или изменять по своему усмотрению.
 

SoftIce1


Рег
11 Jan, 2007

Тем
0

Постов
1

Баллов
1
  • 10, Nov 2014
  • #7
http://msdn.microsoft.com/en-us/library/ms679430(v=vs.85).aspx

Pwd-Last-Set attribute The date and time that the password for this account was last changed.

This value is stored as a large integer that represents the number of 100 nanosecond intervals since January 1, 1601 (UTC). If this value is set to 0 and the User-Account-Control attribute does not contain the UF_DONT_EXPIRE_PASSWD flag, then the user must set the password at the next logon.
 

al_b1


Рег
26 Nov, 2013

Тем
1

Постов
3

Баллов
13
  • 12, Nov 2014
  • #8
Determining Password Expiration Date (msDS-UserPasswordExpiryTimeComputed) PowerShell script to get a simple list of all user accounts and see when their password was going to expire
$userInfo = @()
Import-Module ActiveDirectory
Get-ADuser -Filter * | %{
$sAMAccountName = $null
$sAMAccountName = $_.sAMAccountName
$pwdExpire = $null
$pwdExpire = (Get-ADuser $sAMAccountName -Properties "msDS-UserPasswordExpiryTimeComputed")."msDS-UserPasswordExpiryTimeComputed"
If ($pwdExpire -ne 9223372036854775807){
$pwdExpire = Get-Date -Date ([DateTime]::FromFileTime([Int64]:



arse($pwdExpire))) -Format "yyyy-MM-dd HH:mm:ss"
} Else {
$pwdExpire = "PWD Never Expires"
}
$userInfoEntry = "" | Select "Logon Account","Pwd Expire"
$userInfoEntry."Logon Account" = $sAMAccountName
$userInfoEntry."Pwd Expire" = $pwdExpire
$userInfo += $userInfoEntry
}
Clear-Host
$userInfo | FT -AutoSize


 

al_b1


Рег
26 Nov, 2013

Тем
1

Постов
3

Баллов
13
Тем
49554
Комментарии
57426
Опыт
552966

Интересно