Powershell: Como faço para consultar o pwdLastSet e fazer sentido?

16

Eu preciso obter a última alteração de senha para um grupo de contas em um grupo de segurança do Active Directory, e sinto que isso é algo que o PowerShell deve ser bom.

Agora, eu já estou preso em como ler o atributo pwdLastSet da conta do AD que estou vendo. Mesmo executando algo simples assim:

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

fornece resultados para pwdLastSet que aparecem assim:

pwdLastSet            : {System.__ComObject}

Eu sinto que estou indo sobre o caminho errado, então qual é a melhor maneira de consultar e formatar a saída (o valor é baseado no Windows Epoch e não muito legível) do atributo pwdLastSet?

    
por Bob 26.08.2009 / 00:39

7 respostas

13

Você também pode fazer isso sem um snap-in. Eu tentei isso e funcionou:

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

Wednesday, June 10, 2009 4:32:08 PM

Eu também recebo um System .__ ComObject para pwdLastSet se eu tiver o objeto de usuário configurado assim:
$ user = [adsi] "LDAP: // cn = usuário1, ou = Pessoal, ou = Contas de usuário, dc = ramalamadingdong, dc = net"

Deveria haver uma maneira de usar [System .__ ComObject] .InvokeMember () e reflexão para obter o valor pwdLastSet do objeto $ user, mas não consegui acertar. Eu nunca descobri, então usei o exemplo acima e segui em frente.

Se você vai trabalhar muito com o AD (ou o Exchange ou o SQL Server), pode querer obter o snap-in e usá-lo.

    
por 27.08.2009 / 23:28
19

Os commandlets do AD incorporados que vêm com o Windows 7 / Windows Server 2008 R2 agora podem fazer isso com bastante facilidade. No Windows 7 de um prompt do Powershell:

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

O atributo "PasswordLastSet" parece ser uma versão traduzida do atributo "pwdLastSet" real.

    
por 21.06.2010 / 08:11
3

Existe um jeito mais fácil.

O objeto ADSI tem um método chamado ConvertLargeIntegerToInt64. Note que é um método do objeto ADSI e não o Objeto System .__ que é retornado pela consulta do valor de um atributo timestamp, portanto $ user.pwdLastSet.value.ConvertLargeIntegerToInt64 () não funcionará. Você precisa invocá-lo da seguinte maneira:

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

Isso fará com que você obtenha o registro de data e hora do LDAP, que precisa ser convertido para uma data legível, conforme explicado por Bratch acima. Isso funcionará para qualquer valor de atributo de timestamp retornado pelo provedor ADSI, e o método ConvertLargeIntegerToInt64 é (acredito) exposto por qualquer objeto representando uma entrada de diretório.

Juntando tudo, aqui está como você obtém a data em que a senha foi definida pela última vez:

$user = [ADSI]'LDAP://cn=someusername,ou=someou,dc=somedomain,dc=com'
[datetime]::FromFileTime($user.ConvertLargeIntegerToInt64($user.pwdLastSet.value))
    
por 02.05.2012 / 22:27
3

Aqui está uma maneira fácil de exibir os computadores AD:

Get-ADComputer -Filter *  -Properties name,LastLogonDate,PasswordLastSet,modified,modifyTimeStamp |
  FT Name,DNSHostName,LastLogonDate,PasswordLastSet,modified,modifyTimeStamp | 
    Out-File Computers.csv
    
por 11.10.2012 / 21:11
1

Instalar: link

PowerShell aberto

Execute os seguintes comandos:

add-PSSnapin quest.activeroles.admanagement

Get-QADUser | ft nome de exibição, PasswordLastSet

O primeiro comando carrega o snap da missão que você acabou de baixar. Você não precisa fazer isso se você usar o atalho para quest no seu startmenu. O segundo comando obtém uma lista de todos os usuários e a hora em que a senha foi alterada pela última vez.

    
por 26.08.2009 / 01:46
1

Adicione a função ConvertADSLargeInteger ao seu script, você pode obtê-lo aqui:

PowerShell: converta Active Directory IADSLargeInteger para System.Int64

Veja como você pode usá-lo:

$user = [adsi] "LDAP://cn=user1,ou=Staff,ou=User Accounts,dc=ramalamadingdong,dc=net"
[datetime]::FromFileTimeUtc((ConvertADSLargeInteger $user.pwdlastset.value))
    
por 26.08.2009 / 20:03
0

talvez você deva procurar usar a propriedade passwordLastChanged. Procure aqui mais informações: link

    
por 26.08.2009 / 01:31