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 

흥미 롭습니다! 그 cmdlet에 대해 (분명히) 몰랐습니다. "AccountInactive"에 대해 어떤 속성이 측정됩니까? 마지막 로그온? 비밀번호
MDMarra

100 % 확신하기 위해 조사해야하지만 lastlogondate는 객체를 볼 때 반환되는 속성 중 하나이며 passwordlastset은 아닙니다. 기술 문서는 실제로 어떤 속성을 사용하는지 자세히 설명하지 않습니다.
Mike

1
좀 더 살펴보고 lastlogondate는 lastlogontimestamp의 변환 인 것처럼 보입니다. 스키마에는 lastlogondate라는 속성이 없습니다. 희망이 도움이됩니다.
Mike

5

컴퓨터는 기본적으로 30 일마다 계정 비밀번호를 변경합니다. 컴퓨터가 오랫동안 암호를 변경하지 않은 경우 더 이상 네트워크에 연결되지 않았 음을 의미합니다.

이 PowerShell 스크립트는 2 개의 텍스트 파일을 출력합니다. 하나는 비활성화 된 컴퓨터를위한 것이고 다른 하나는 분리 된 컴퓨터 계정 개체를위한 것입니다. 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을 분명히 요구했지만 OP가 마음에 들지 않으면 서 다른 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 만 있으면되지만 Bob의 책상 아래에 앉아 전원이 켜지지 않는 PC를 잊어 버린 경우 90이 더 안전 해 보입니다.

편집 : 아, 나는 또한이 사용 사례에서는 중요하지 않지만 다른 경우에는 시간대 지원을 생략했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.