ฉันจะค้นหาวัตถุคอมพิวเตอร์ที่ถูกโยงถึงใน Active Directory โดยใช้ PowerShell ได้อย่างไร


10

ฉันจะค้นหาบัญชีคอมพิวเตอร์ทั้งหมดในโดเมน Active Directory ที่ไม่ได้ใช้งานเป็นเวลา x วันโดยใช้ PowerShell ได้อย่างไร

โปรดทราบว่าฉันรู้จริงวิธีการทำเช่นนี้ นี่เป็นคำถามที่ตอบตัวเองเพียงเพื่อให้ได้ความรู้ที่นั่น หากใครมีวิธีที่ดีกว่าอย่าลังเลที่จะโพสต์มัน!

คำตอบ:


10

นี่จะให้บัญชีคอมพิวเตอร์ทั้งหมดที่ไม่มีกิจกรรมสำหรับ 365 วันที่ผ่านมา

Search-ADAccount -AccountInactive -ComputersOnly -TimeSpan 365.00:00:00

สิ่งนี้จะเรียงลำดับให้คุณโดยล่าสุดจากการเข้าสู่ระบบ

Search-ADAccount -AccountInactive -ComputersOnly -TimeSpan 365.00:00:00 | Sort-Object lastlogondate | Ft name,lastlogondate -auto

นี่จะทำให้คุณปิดใช้งานบัญชีคอมพิวเตอร์

Search-ADAccount -AccountDisabled -ComputersOnly 

! ที่น่าสนใจ ฉัน (ชัด) ไม่รู้เกี่ยวกับ cmdlet นั้น คุณลักษณะใดที่วัดได้สำหรับ "AccountInactive" lastlogondate? passwordlastset?
MDMarra

ฉันจะต้องตรวจสอบให้แน่ใจ 100% แต่ฉันรู้ว่า Lastlogondate เป็นหนึ่งในคุณสมบัติที่ส่งคืนถ้าคุณดูที่วัตถุ passwordlastset ไม่ได้ บทความด้านเทคนิคไม่ได้ให้รายละเอียดว่าคุณลักษณะใดที่ใช้
ไมค์

1
มองดูมันอีกเล็กน้อยและ Lastlogondate ดูเหมือนว่ามันเป็นเพียงการเปลี่ยนแปลงของ lastlogontimestamp ไม่มีแอตทริบิวต์ที่ชื่อ lastlogondate ในสคีมา หวังว่าจะช่วย
ไมค์

5

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

สคริปต์ PowerShell นี้จะส่งออกไฟล์ข้อความ 2 ไฟล์ หนึ่งสำหรับคอมพิวเตอร์ที่ปิดการใช้งานหนึ่งสำหรับวัตถุบัญชีคอมพิวเตอร์กำพร้า คุณต้องติดตั้งโมดูล Active Directory PowerShell

ในตัวอย่างนี้ฉันแยก OU "Encrypted Laptops" เนื่องจากเป็นแล็ปท็อปมือถือที่ถูกตัดการเชื่อมต่อเป็นระยะเวลานาน คุณสามารถลบส่วนนั้นได้หากคุณไม่มีการตั้งค่าที่คล้ายกัน

Import-Module ActiveDirectory

$Date = [DateTime]::Today

#Sets the deadline for when computers should have last changed their password by.
$Deadline = $Date.AddDays(-365)   

#Makes the date string for file naming
$FileName = [string]$Date.month + [string]$Date.day + [string]$Date.year 


#Generates a list of computer accounts that are enabled and aren't in the Encrypted Computers OU, but haven't set their password since $Deadline
$OldList = Get-ADComputer -Filter {(PasswordLastSet -le $Deadline) -and (Enabled -eq $TRUE)} -Properties PasswordLastSet -ResultSetSize $NULL |
Where {$_.DistinguishedName -notlike "*Encrypted Laptops*"} | 
Sort-Object -property Name | FT Name,PasswordLastSet,Enabled -auto 

#Generates a list of computer accounts that are disabled and sorts by name.
$DisabledList = Get-ADComputer -Filter {(Enabled -eq $FALSE)} -Properties PasswordLastSet -ResultSetSize $null | 
Sort-Object -property Name | FT Name,PasswordLastSet,Enabled -auto

#Creates the two files, assuming they are not $NULL. If they are $NULL, the file will not be created.
if ($OldList -ne $NULL) {
    Out-File "C:\users\marra\desktop\Old$Filename.txt" -InputObject $OldList
}

if ($DisabledList -ne $NULL) {
    Out-File "C:\users\marra\desktop\Disabled$Filename.txt" -InputObject $DisabledList
}

0

หนึ่งล้านขอบคุณ! ฉันต้องการที่จะเพิ่มบิดของฉันนี้ ฉันต้องการค้นหาเฉพาะเซิร์ฟเวอร์ที่ถูกปิดใช้งานหรือไม่ได้ปิดการใช้งานและไม่ได้ใช้งานจริง นี่คือสิ่งที่ฉันมาด้วยและดูเหมือนว่าจะทำงาน

Import-Module ActiveDirectory

$Date = [DateTime]::Today

#Sets the deadline for when computers should have last changed their password by.
$Deadline = $Date.AddDays(-365)   

#Makes the date string for file naming
$FileName = [string]$Date.month + [string]$Date.day + [string]$Date.year 

#Generates a list of computer server accounts that are enabled, but haven't set their password since $Deadline
$OldList = Get-ADComputer -Filter {(PasswordLastSet -le $Deadline) -and (Enabled -eq $TRUE) -and (OperatingSystem -Like "Windows *Server*")} -Properties PasswordLastSet -ResultSetSize $NULL |
Sort-Object -property Name | FT Name,PasswordLastSet,Enabled -auto 

#Generates a list of computer server accounts that are disabled and sorts by name.
$DisabledList = Get-ADComputer -Filter {(Enabled -eq $FALSE) -and (OperatingSystem -Like "Windows *Server*")} -Properties PasswordLastSet -ResultSetSize $null | 
Sort-Object -property Name | FT Name,PasswordLastSet,Enabled -auto

#Creates the two files, assuming they are not $NULL. If they are $NULL, the file will not be created.
if ($OldList -ne $NULL) {
    Out-File "C:\temp\Old$Filename.txt" -InputObject $OldList
}

if ($DisabledList -ne $NULL) {
    Out-File "C:\temp\Disabled$Filename.txt" -InputObject $DisabledList
} 

0

ฉันรู้ว่า OP ขอให้ PowerShell ชัดเจน แต่ถ้าคุณไม่ชอบไม่มีและไม่ต้องการที่จะเรียนรู้จากไวยากรณ์อื่นของ Microsoft แล้ว Python snippet ต่อไปนี้จะให้วันที่ในรูปแบบที่ถูกต้องในการใช้ ด้วยแบบสอบถาม LDAP

import datetime, time
def w32todatetime(w32):
    return datetime.fromtimestamp((w32/10000000) - 11644473600)
def datetimetow32(dt):
    return int((time.mktime(dt.timetuple()) + 11644473600) * 10000000)

90daysago = datetime.datetime.now() - datetime.timedelta(days=90)
print datetimetow32(90daysago)

ซึ่งสามารถใช้ดังต่อไปนี้เพื่อค้นหาคอมพิวเตอร์ Windows ทั้งหมดที่ไม่ได้เปลี่ยนรหัสผ่านใน 90 วันที่ผ่านมา

(&(objectCategory=computer)(objectClass=computer)(operatingSystem=Windows*)(pwdLastSet<=130604356890000000))

คุณอาจต้องใช้ 30 เป็นระยะเวลาเริ่มต้นสำหรับเครื่อง Windows เพื่อเปลี่ยนรหัสผ่านของพวกเขาคือ 30 วัน แต่ 90 ดูเหมือนจะปลอดภัยกว่าในกรณีที่คุณลืมเกี่ยวกับพีซีเครื่องนั้นซึ่งอยู่ใต้โต๊ะทำงานของ Bob และไม่เคยเปิดใช้งาน

แก้ไข: โอ้ฉันยังละเว้นการสนับสนุนเขตเวลาในเรื่องนี้ซึ่งอาจไม่สำคัญในกรณีการใช้งานนี้ แต่อาจอยู่ในที่อื่น ๆ

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