Powershell: ¿Cómo consulto pwdLastSet y tengo sentido?

16

Necesito obtener el último cambio de contraseña para un grupo de cuentas en un grupo de seguridad de Active Directory, y creo que esto es algo en lo que PowerShell debería ser bueno.

En este momento, ya estoy atascado en cómo leer el atributo pwdLastSet de la cuenta de AD que estoy viendo. Incluso ejecutando algo simple como esto:

[adsi] "LDAP://cn=user1,ou=Staff,ou=User Accounts,dc=ramalamadingdong,dc=net" | Format-List *

da resultados para pwdLastSet que aparecen así:

pwdLastSet            : {System.__ComObject}

Siento que hago esto de la manera incorrecta, entonces, ¿cuál es la mejor manera de consultar y luego formatear la salida (el valor se basa en la época de Windows y no es muy legible para los humanos) del atributo pwdLastSet?

Beto
fuente

Respuestas:

13

También puede hacer esto sin un complemento. Intenté esto y funcionó:

PS #> $ searcher = New-Object DirectoryServices.DirectorySearcher
PS #> $ searcher.Filter = "(& (samaccountname = user1))"
PS #> $ resultados = $ searcher.findone ()
PS #> [datetime] :: fromfiletime ($ results.properties.pwdlastset [0])

Miércoles 10 de junio de 2009 4:32:08 PM

También obtengo un sistema .__ ComObject para pwdLastSet si tengo el objeto de usuario configurado de esta manera:
$ user = [adsi] "LDAP: // cn = user1, ou = Staff, ou = User Accounts, dc = ramalamadingdong, dc = net "

Debería haber una manera de usar [System .__ ComObject] .InvokeMember () y la reflexión para obtener ese valor pwdLastSet del objeto $ user, pero no he podido hacerlo bien. Nunca lo descubrí, así que utilicé el ejemplo anterior y seguí adelante.

Si va a hacer mucho trabajo con AD (o Exchange o SQL Server), es posible que desee obtener el complemento y usarlo.

Bratch
fuente
1
Me ha gustado hacer varias tareas simples en PowerShell para tratar de aprender la sintaxis. Estaba un poco deprimido porque en todas partes miraba que la respuesta era usar un complemento. ¡Gracias!
Bob
19

Los comandos AD incorporados que vienen con Windows 7 / Windows Server 2008 R2 ahora pueden hacer esto de manera bastante simple. En Windows 7 desde un indicador de Powershell:

Import-Module ActiveDirectory
Get-ADUser 'user1' -properties PasswordLastSet | Format-List

El atributo "PasswordLastSet" parece ser una versión traducida del atributo real "pwdLastSet".

Neobyte
fuente
Es curioso lo que significa ausencia de cualquier valor para PasswordLastSet ... ¿Significa 100% que no hubo cambios desde que la contraseña se configuró inicialmente?
Mikhail
No tengo un cuadro para probarlo, pero creo que es más probable que aún no se haya establecido una contraseña en el objeto.
Neobyte
@Mikhail, la mayoría de las veces la ausencia de cualquier valor para PasswordLastSet significa que no ejecuta el comando en un indicador elevado.
JPBlanc
3

Hay una manera más fácil.

El objeto ADSI tiene un método llamado ConvertLargeIntegerToInt64. Tenga en cuenta que es un método del objeto ADSI y no el Sistema .__ Como objeto que se devuelve al consultar el valor de un atributo de marca de tiempo, por lo que $ user.pwdLastSet.value.ConvertLargeIntegerToInt64 () no funcionará. Debe invocarlo de la siguiente manera:

$user.ConvertLargeIntegerToInt64($user.pwdLastSet.value)

Eso le proporcionará la marca de tiempo LDAP, que debe convertirse a una fecha legible, como explica Bratch anteriormente. Esto funcionará para cualquier valor de atributo de marca de tiempo devuelto por el proveedor ADSI, y el método ConvertLargeIntegerToInt64 está (creo) expuesto por cualquier objeto que represente una entrada de directorio.

Poniendo todo junto, así es como obtienes la fecha en que se configuró la contraseña por última vez:

$user = [ADSI]'LDAP://cn=someusername,ou=someou,dc=somedomain,dc=com'
[datetime]::FromFileTime($user.ConvertLargeIntegerToInt64($user.pwdLastSet.value))
Adi Inbar
fuente
3

Aquí hay una manera fácil de mostrar las computadoras AD:

Get-ADComputer -Filter *  -Properties name,LastLogonDate,PasswordLastSet,modified,modifyTimeStamp |
  FT Name,DNSHostName,LastLogonDate,PasswordLastSet,modified,modifyTimeStamp | 
    Out-File Computers.csv
William
fuente
1

Instalar: http://www.quest.com/powershell/activeroles-server.aspx

PowerShell abierto

Ejecute los siguientes comandos:

add-PSSnapin quest.activeroles.admanagement

Get-QADUser | ft displayname, PasswordLastSet

El primer comando carga el complemento de búsqueda que acaba de descargar. No necesita hacer esto si usa el atajo para buscar en su menú de inicio. El segundo comando obtiene una lista de todos los usuarios y la hora en que la contraseña se modificó por última vez.


fuente