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

16

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

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

[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}

Sinto que estou fazendo isso da maneira errada; então, qual é a melhor maneira de consultar e formatar a saída (o valor é baseado na época do Windows e não é muito legível para humanos) do atributo pwdLastSet?

Prumo
fonte

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 = usuário1))"
PS #> $ results = $ searcher.findone ()
PS #> [datetime] :: fromfiletime ($ results.properties.pwdlastset [0])

Quarta-feira, 10 de junho de 2009 16:32:08

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

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

Se você estiver trabalhando muito com o AD (ou Exchange ou SQL Server), poderá obter o snap-in e usá-lo.

Bratch
fonte
11
Estive em um pontapé para executar várias tarefas simples no PowerShell para tentar aprender a sintaxe. Eu estava meio deprimido que em todos os lugares que olhei a resposta estava usando um suplemento. Obrigado!
22499 Bob
19

Os comandos do AD incorporados que acompanham o Windows 7 / Windows Server 2008 R2 agora podem fazer isso com bastante simplicidade. No Windows 7, a partir 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.

Neobyte
fonte
Apenas curioso, o que significa ausência de qualquer valor para PasswordLastSet ... 100% significa que não houve alterações desde que a senha foi definida inicialmente?
Mikhail
Não tenho uma caixa para testá-lo, mas acho que é mais provável que ainda não tenha sido definida uma senha no objeto.
Neobyte 23/02
@ Mikhail, na maioria das vezes, a ausência de qualquer valor para PasswordLastSet significa que você não executa o comando em um prompt elevado.
JPBlanc
3

Existe uma maneira mais fácil.

O objeto ADSI possui um método chamado ConvertLargeIntegerToInt64. Observe que é um método do objeto ADSI e não do objeto System .__ retornado consultando o valor de um atributo de carimbo de data / hora, para que $ user.pwdLastSet.value.ConvertLargeIntegerToInt64 () não funcione. Você precisa invocá-lo da seguinte maneira:

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

Isso fornecerá 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 do atributo timestamp retornado pelo provedor ADSI, e o método ConvertLargeIntegerToInt64 é (acredito) exposto por qualquer objeto que represente 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))
Adi Inbar
fonte
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
William
fonte
1

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

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-in da missão que você acabou de baixar. Você não precisa fazer isso se usar o atalho para pesquisar no menu inicial. O segundo comando obtém uma lista de todos os usuários e o horário em que a senha foi alterada pela última vez.


fonte
1

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

PowerShell: Converter IADSLargeInteger do Active Directory em System.Int64

Aqui está como você o usaria:

$user = [adsi] "LDAP://cn=user1,ou=Staff,ou=User Accounts,dc=ramalamadingdong,dc=net"
[datetime]::FromFileTimeUtc((ConvertADSLargeInteger $user.pwdlastset.value))
Mike Pfeiffer
fonte