Powershell:pwdLastSetにクエリを実行して意味を持たせるにはどうすればよいですか?


16

Active Directoryセキュリティグループ内のアカウントグループの最後のパスワード変更を取得する必要がありますが、これはPowerShellが得意なものだと思います。

今、私が見ているADアカウントからpwdLastSet属性を読み取る方法に既に固執しています。次のような単純なものでも実行できます。

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

pwdLastSetの結果は次のように表示されます。

pwdLastSet            : {System.__ComObject}

私はこれについて間違った方法で行っているように感じますので、pwdLastSet属性の出力(値はWindows Epochに基づいており、非常に人間が読めるものではありません)を照会してからフォーマットする最良の方法は何ですか?

回答:


13

スナップインなしでこれを行うこともできます。私はこれを試してみましたが、うまくいきました:

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

2009年6月10日水曜日午後4時32分8秒

次のようなユーザーオブジェクトが設定されている場合、pwdLastSetのSystem .__ ComObjectも取得します。
$ user = [adsi] "LDAP:// cn = user1、ou = Staff、ou = User Accounts、dc = ramalamadingdong、dc = net 」

[System .__ ComObject] .InvokeMember()とリフレクションを使用して$ userオブジェクトからそのpwdLastSet値を取得する方法があるはずですが、私はそれを正しく取得することができませんでした。私はそれを理解しなかったので、上記の例を使用して先に進みました。

AD(またはExchangeまたはSQL Server)で多くの作業を行う場合は、スナップインを取得して使用することをお勧めします。


1
PowerShellでさまざまな簡単なタスクを実行して、構文を学習しようとしています。私は、答えを見るところどこでもアドインの使用であると気が落ちました。ありがとう!
ボブ

19

Windows 7 / Windows Server 2008 R2に付属の組み込みADコマンドレットは、これを十分に簡単に実行できるようになりました。PowershellプロンプトからのWindows 7の場合:

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

「PasswordLastSet」属性は、実際の「pwdLastSet」属性の翻訳バージョンのようです。


PasswordLastSetの値が存在しないことを意味するのはどういうことですか... 100%は、パスワードが最初に設定されてから変更がなかったことを意味しますか?
ミハイル

テストするためのボックスはありませんが、オブジェクトにパスワードがまだ設定されていない可能性が高いと思います。
ネオバイト14

@Mikhail、ほとんどの場合、PasswordLastSetの値が存在しないということは、昇格したプロンプトでコマンドを実行しないことを意味します。
JPBlan 14年

3

もっと簡単な方法があります。

ADSIオブジェクトには、ConvertLargeIntegerToInt64というメソッドがあります。それはADSIオブジェクトのメソッドとだと注意ません $ user.pwdLastSet.value.ConvertLargeIntegerToInt64ので、タイムスタンプattibuteの値を照会することによって返されるシステム.__ Comobjectは、()は動作しません。次のように呼び出す必要があります。

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

上記のBratchで説明したように、LDAPタイムスタンプを取得して、読み取り可能な日付に変換する必要があります。これは、ADSIプロバイダーによって返されるタイムスタンプ属性値に対して機能し、ConvertLargeIntegerToInt64メソッドは、ディレクトリエントリを表すオブジェクトによって公開されます(信じられます)。

すべてをまとめると、パスワードが最後に設定された日付を取得する方法は次のとおりです。

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

3

ADコンピューターを表示する簡単な方法を次に示します。

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

1

インストール:http : //www.quest.com/powershell/activeroles-server.aspx

オープンシェル

次のコマンドを実行します。

add-PSSnapin quest.activeroles.admanagement

Get-QADUser | ft displayname、PasswordLastSet

最初のコマンドは、ダウンロードしたばかりのクエストスナップインをロードします。スタートメニューでショートカットを使用してクエストを行う場合、これを行う必要はありません。2番目のコマンドは、すべてのユーザーとユーザーのリスト、およびパスワードが最後に変更された時刻を取得します。



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.