Powershell: ฉันจะสอบถาม pwdLastSet และทำให้มันมีเหตุผลได้อย่างไร


17

ฉันต้องเปลี่ยนรหัสผ่านล่าสุดสำหรับกลุ่มบัญชีในกลุ่มความปลอดภัย Active Directory และฉันรู้สึกว่านี่เป็นสิ่งที่ PowerShell ควรจะทำได้

ตอนนี้ฉันติดอยู่ที่วิธีอ่านแอตทริบิวต์ pwdLastSet จากบัญชีโฆษณาที่ฉันกำลังดูอยู่ แม้แต่การทำอะไรง่ายๆอย่างนี้:

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

ให้ผลลัพธ์สำหรับ pwdLastSet ที่ปรากฏดังนี้:

pwdLastSet            : {System.__ComObject}

ฉันรู้สึกว่าฉันไปผิดทางดังนั้นวิธีที่ดีที่สุดในการสืบค้นแล้วจัดรูปแบบผลลัพธ์ (ค่าขึ้นอยู่กับ Windows Epoch และไม่สามารถอ่านได้โดยมนุษย์) ของแอตทริบิวต์ pwdLastSet?

คำตอบ:


13

คุณสามารถทำได้โดยไม่ต้องใช้สแนปอิน ฉันลองสิ่งนี้และใช้งานได้:

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

วันพุธที่ 10 มิถุนายน 2009 เวลา 16:32:08 น

ฉันยังได้รับระบบ. ComObject สำหรับ pwdLastSet ถ้าฉันมีชุดวัตถุผู้ใช้เช่นนี้:
$ user = [adsi] "LDAP: // cn = user1, ou = พนักงาน, ou = บัญชีผู้ใช้, dc = ramalamadingdong, dc = net "

ควรมีวิธีใช้ [System .__ ComObject] .InvokeMember () และภาพสะท้อนเพื่อรับค่า pwdLastSet จากวัตถุ $ user แต่ฉันไม่สามารถทำให้ถูกต้องได้ ฉันไม่เคยคิดออกเลยดังนั้นฉันจึงใช้ตัวอย่างข้างต้นและเดินหน้าต่อไป

หากคุณกำลังจะทำงานกับ AD (หรือ Exchange หรือ SQL Server) เป็นจำนวนมากคุณอาจต้องการรับ snapin และใช้มัน


1
ฉันได้รับการเตะเพื่อทำงานง่ายๆใน PowerShell เพื่อพยายามเรียนรู้ไวยากรณ์ ฉันรู้สึกหดหู่ใจทุกที่ที่ฉันดูคำตอบคือใช้ Add-in ขอบคุณ!
บ๊อบ

19

commandlets AD แบบ inbuilt ที่มาพร้อมกับ Windows 7 / Windows Server 2008 R2 สามารถทำได้อย่างง่ายดาย บน Windows 7 จากพรอมต์ Powershell:

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

แอตทริบิวต์ "PasswordLastSet" ดูเหมือนจะเป็นรุ่นแปลของแอตทริบิวต์ "pwdLastSet" จริง


แค่อยากรู้ว่าการที่ไม่มีค่าใด ๆ สำหรับ PasswordLastSet ... หมายความว่า 100% หมายความว่าไม่มีการเปลี่ยนแปลงใด ๆ ตั้งแต่ตั้งค่ารหัสผ่านครั้งแรก
มิคาอิล

ฉันไม่มีกล่องทดสอบ แต่ฉันคิดว่ามันเป็นไปได้มากกว่าที่ยังไม่มีการตั้งรหัสผ่านบนวัตถุ
Neobyte

@Mailail ส่วนใหญ่ไม่มีค่าใด ๆ สำหรับ PasswordLastSet หมายความว่าคุณไม่ได้รันคำสั่งในพร้อมท์ที่ยกระดับ
JPBlanc

3

มีวิธีที่ง่ายกว่า

วัตถุ ADSI มีวิธีการที่เรียกว่า ConvertLargeIntegerToInt64 โปรดทราบว่ามันเป็นวิธีการของวัตถุ ADSI ไม่ใช่ System .__ Comobject ที่ส่งคืนโดยการสอบถามค่าของคุณสมบัติประทับเวลาดังนั้น $ user.pwdLastSet.value.ConvertLargeIntegerToInt64 () จะไม่ทำงาน คุณต้องเรียกใช้ดังต่อไปนี้:

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

ที่จะทำให้คุณได้รับการประทับเวลา LDAP ซึ่งจะต้องแปลงเป็นวันที่อ่านได้ตามที่อธิบายโดย Bratch ด้านบน สิ่งนี้จะทำงานสำหรับค่าแอตทริบิวต์การประทับเวลาใด ๆ ที่ส่งคืนโดยผู้ให้บริการ ADSI และวิธีการ ConvertLargeIntegerToInt64 คือ (ฉันเชื่อว่า) ถูกเปิดเผยโดยวัตถุใด ๆ ที่แสดงรายการไดเรกทอรี

รวบรวมทั้งหมดไว้ด้วยกันนี่คือวิธีที่คุณได้รับวันที่ที่รหัสผ่านถูกตั้งค่าล่าสุด:

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

3

นี่เป็นวิธีง่ายๆในการแสดงคอมพิวเตอร์โฆษณา:

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

เปิด PowerShell

รันคำสั่งต่อไปนี้:

add-PSSnapin quest.activeroles.admanagement

Get-QADUser | ft displayname, PasswordLastSet

คำสั่งแรกโหลด Quest Snapin ที่คุณเพิ่งดาวน์โหลด คุณไม่จำเป็นต้องทำสิ่งนี้หากคุณใช้ทางลัดเพื่อค้นหาในเมนูเริ่มต้นของคุณ คำสั่งที่สองได้รับรายการทั้งหมดและผู้ใช้และเวลาที่มีการเปลี่ยนรหัสผ่านครั้งล่าสุด


1

เพิ่มฟังก์ชั่น ConvertADSLargeInteger ให้กับสคริปต์ของคุณคุณสามารถรับได้ที่นี่:

PowerShell: แปลง Active Directory IADSLargeInteger เป็น System.Int64

นี่คือวิธีที่คุณจะใช้:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.