Bagaimana cara menemukan objek komputer yatim di Active Directory menggunakan PowerShell?

10

Bagaimana saya bisa menemukan semua akun komputer di domain Active Directory saya yang sudah tidak aktif selama x hari menggunakan PowerShell?

Perhatikan bahwa saya benar-benar tahu bagaimana melakukan ini. Ini adalah pertanyaan yang dijawab sendiri hanya untuk mendapatkan pengetahuan di luar sana. Jika ada orang lain yang memiliki cara yang lebih baik, silakan mempostingnya!

MDMarra
sumber

Jawaban:

10

Ini akan memberi Anda semua akun komputer yang tidak memiliki aktivitas selama 365 hari terakhir.

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

Ini akan mengurutkannya untuk Anda dengan lastlogondate.

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

Ini akan memberi Anda akun komputer yang dinonaktifkan.

Search-ADAccount -AccountDisabled -ComputersOnly 
Mike
sumber
Menarik! Saya (jelas) tidak tahu tentang cmdlet itu. Atribut apa yang diukur untuk "AccountInactive"? lastlogondate? kata sandilastset?
MDMarra
Saya harus melihat ke dalam untuk menjadi 100% yakin, tetapi saya tahu bahwa lastlogondate adalah salah satu atribut yang dikembalikan jika Anda melihat objek, passwordlastset tidak. Artikel technet tidak benar-benar merinci atribut yang digunakannya.
Mike
1
Melihat ke dalamnya sedikit lebih dan lastlogondate sepertinya itu hanya konversi lastlogontestestamp. Tidak ada atribut yang disebut lastlogondate dalam skema. Semoga itu bisa membantu.
Mike
5

Komputer mengubah kata sandi akun mereka setiap 30 hari secara default. Jika komputer tidak mengubah kata sandi dalam jangka waktu lama, itu berarti mereka tidak lagi terhubung ke jaringan.

Skrip PowerShell ini akan menghasilkan 2 file teks. Satu untuk komputer yang dinonaktifkan, satu untuk objek akun komputer yatim. Anda harus memiliki modul PowerShell Direktori Aktif yang diinstal.

Dalam contoh ini, saya mengecualikan OU "Laptop Terenkripsi", karena mereka laptop mobile yang terputus untuk periode waktu yang lama. Anda dapat menghapus bagian itu jika Anda tidak memiliki pengaturan serupa

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
}
MDMarra
sumber
0

Sejuta terima kasih! Saya ingin menambahkan tweak saya ke ini. Saya hanya perlu menemukan server yang telah dinonaktifkan atau tidak dinonaktifkan dan tidak dalam produksi. Inilah yang saya buat dan sepertinya berhasil.

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
} 
Geekgal
sumber
0

Saya tahu OP dengan jelas meminta PowerShell tetapi jika Anda tidak menyukainya, tidak memilikinya, dan tidak ingin mempelajari sintaks Microsoft lain maka cuplikan Python berikut akan memberi Anda tanggal dalam format yang benar untuk digunakan dengan kueri 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)

Yang kemudian dapat digunakan sebagai berikut untuk menemukan semua komputer Windows yang belum mengubah kata sandi mereka dalam 90 hari terakhir.

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

Anda mungkin hanya perlu 30 sebagai periode default untuk mesin Windows untuk mengubah kata sandi mereka adalah 30 hari tetapi 90 tampaknya lebih aman jika Anda lupa tentang PC yang berada di bawah meja Bob dan tidak pernah dinyalakan.

EDIT: Oh juga saya telah menghilangkan dukungan zona waktu dalam hal ini yang mungkin tidak masalah dalam kasus penggunaan ini tetapi mungkin pada orang lain.

Samuel Harmer
sumber