Powershell: Bagaimana cara saya meminta pwdLastSet dan masuk akal?

16

Saya perlu mendapatkan perubahan kata sandi terakhir untuk sekelompok akun di grup keamanan Direktori Aktif, dan saya merasa ini adalah sesuatu yang harus dilakukan PowerShell dengan baik.

Saat ini, saya sudah terjebak pada cara membaca atribut pwdLastSet dari akun AD yang saya lihat. Bahkan menjalankan sesuatu yang sederhana seperti ini:

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

memberikan hasil untuk pwdLastSet yang muncul seperti ini:

pwdLastSet            : {System.__ComObject}

Saya merasa saya melakukan ini dengan cara yang salah, jadi apa cara terbaik untuk melakukan query dan kemudian memformat output (nilainya didasarkan pada Windows Epoch dan tidak dapat dibaca oleh manusia) dari atribut pwdLastSet?

Bob
sumber

Jawaban:

13

Anda juga dapat melakukan ini tanpa snap-in. Saya mencoba ini dan berhasil:

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

Rabu, 10 Juni 2009 4:32:08 PM

Saya juga mendapatkan Sistem .__ ComObject untuk pwdLastSet jika saya memiliki objek pengguna yang diatur seperti ini:
$ user = [adsi] "LDAP: // cn = user1, ou = Staf, ou = Akun Pengguna, dc = ramalamadingdong, dc = net "

Seharusnya ada cara untuk menggunakan [System .__ ComObject] .InvokeMember () dan refleksi untuk mendapatkan nilai pwdLastSet dari objek $ user, tapi saya belum bisa memperbaikinya. Saya tidak pernah memahaminya, jadi saya menggunakan contoh di atas dan melanjutkan.

Jika Anda akan melakukan banyak pekerjaan dengan AD (atau Exchange atau SQL Server) Anda mungkin ingin mendapatkan snapin untuk itu dan menggunakannya.

Awal
sumber
1
Saya siap melakukan berbagai tugas sederhana di PowerShell untuk mencoba mempelajari sintaksis. Saya agak tertekan bahwa di mana-mana saya melihat jawabannya menggunakan add-in. Terima kasih!
Bob
19

Commandlets AD bawaan yang datang dengan Windows 7 / Windows Server 2008 R2 sekarang dapat melakukan ini cukup sederhana. Pada Windows 7 dari prompt Powershell:

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

Atribut "PasswordLastSet" tampaknya merupakan versi terjemahan dari atribut "pwdLastSet" yang sebenarnya.

Neobyte
sumber
Hanya ingin tahu apa artinya tidak adanya nilai untuk PasswordLastSet ... Apakah itu 100% berarti bahwa tidak ada perubahan sejak kata sandi ditetapkan pada awalnya?
Mikhail
Saya tidak memiliki kotak untuk mengujinya, tetapi saya pikir kemungkinan besar belum ada kata sandi yang ditetapkan pada objek.
Neobyte
@Mikhail, sebagian besar waktu tidak memiliki nilai untuk PasswordLastSet berarti Anda tidak menjalankan perintah dalam prompt yang ditinggikan.
JPBlanc
3

Ada cara yang lebih mudah.

Objek ADSI memiliki metode yang disebut ConvertLargeIntegerToInt64. Perhatikan bahwa ini adalah metode objek ADSI dan bukan Sistem .__ Comobject yang dikembalikan dengan menanyakan nilai attibute timestamp, jadi $ user.pwdLastSet.value.ConvertLargeIntegerToInt64 () tidak akan berfungsi. Anda perlu menjalankannya sebagai berikut:

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

Itu akan memberi Anda cap waktu LDAP, yang perlu dikonversi ke tanggal yang dapat dibaca, seperti dijelaskan oleh Bratch di atas. Ini akan berfungsi untuk nilai atribut timestamp apa pun yang dikembalikan oleh penyedia ADSI, dan metode ConvertLargeIntegerToInt64 (saya percaya) diekspos oleh objek apa pun yang mewakili entri direktori.

Menyatukan semuanya, berikut adalah cara Anda mendapatkan tanggal saat kata sandi terakhir ditetapkan:

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

Berikut adalah cara mudah untuk menampilkan Komputer AD:

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

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

buka PowerShell

Jalankan perintah berikut:

add-PSSnapin quest.activeroles.admanagement

Get-QADUser | ft displayname, PasswordLastSet

Perintah pertama memuat snapin pencarian yang baru saja Anda unduh. Anda tidak perlu melakukan ini jika Anda menggunakan pintasan untuk mencari di startmenu Anda. Perintah kedua mendapatkan daftar semua dan pengguna dan waktu di sana kata sandi terakhir diubah.


sumber
1

Tambahkan fungsi ConvertADSLargeInteger ke skrip Anda, Anda bisa mendapatkannya di sini:

PowerShell: Konversi Active Directory IADSLargeInteger ke System.Int64

Begini cara Anda menggunakannya:

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