PowerShellを使用してActive Directoryで孤立したコンピューターオブジェクトを見つけるにはどうすればよいですか?


10

PowerShellを使用して、x日間非アクティブであるActive Directoryドメイン内のすべてのコンピューターアカウントを見つけるにはどうすればよいですか?

私が実際にこれを行う方法を知っていることに注意してください。これは、知識をそこに伝えるための自己回答型の質問です。他の誰かがより良い方法を持っている場合は、遠慮なく投稿してください!

回答:


10

これにより、過去365日間アクティビティがないすべてのコンピューターアカウントが得られます。

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

これにより、lastlogondateで並べ替えられます。

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

これにより、コンピューターアカウントが無効になります。

Search-ADAccount -AccountDisabled -ComputersOnly 

面白い!私は(明らかに)そのコマンドレットを知りませんでした。「AccountInactive」ではどの属性が測定されますか?lastlogondate?passwordlastset?
MDMarra 2012

100%確実にするために調査する必要がありますが、lastlogondateはオブジェクトを確認した場合に返される属性の1つであり、passwordlastsetはそうではないことを知っています。technetの記事では、使用する属性について詳しく説明していません。
マイク

1
もう少し見てみると、lastlogondateは、lastlogontimestampの変換にすぎないように見えます。スキーマにlastlogondateという属性はありません。お役に立てば幸いです。
マイク、

5

コンピューターは、デフォルトで30日ごとにアカウントのパスワードを変更します。コンピューターのパスワードが長期間変更されていない場合は、ネットワークに接続されていないことを意味します。

このPowerShellスクリプトは2つのテキストファイルを出力します。1つは無効なコンピューター用で、もう1つは孤立したコンピューターアカウントオブジェクト用です。Active Directory PowerShellモジュールがインストールされている必要があります。

この例では、「暗号化されたラップトップ」OUを除外します。これは、長時間切断されたモバイルラップトップであるためです。同様の設定がない場合は、そのセクションを削除できます

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スニペットで使用できる正しい形式の日付が表示されます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)

これを次のように使用して、過去90日間にパスワードを変更していないすべてのWindowsコンピューターを見つけることができます。

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

Windowsマシンがパスワードを変更するデフォルトの期間は30日なので、おそらく30だけが必要ですが、ボブの机の下に座って電源が入らないPCを忘れた場合は、90の方が安全に思えます。

編集:ああ、私はこれでタイムゾーンのサポートを省略しましたが、これはおそらくこのユースケースでは重要ではありませんが、他のケースではそうかもしれません。

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