我正在编写 AD 清理脚本,但无法使其正常工作。我试图满足的参数是用户在过去 90 天内未登录并且是在 90 天前创建的。问题是它获取的是过去 90 天内创建的用户。这是我正在编写的脚本:
Import-Module ActiveDirectory
$OU="ou=Users,ou=middle,ou=top,dc=contoso,dc=com"
$CSV_USERS=""
foreach ($x in $OU) {
$USERS=Search-ADAccount -AccountInactive -Timespan 90.00:00:00 -Searchbase $x | Where {$_.whenCreated -le ((Get-Date).AddDays(-90).toFileTime())}
if ($USERS) {
$CSV_USERS=$CSV_USERS + $USERS
}
}
$date=Get-Date -Format "dMy"
$path="C:\Scripts\TestScript_disable_users_"+$date+".csv"
if($CSV_USERS) {
Out-File -FilePath $path -InputObject $CSV_USERS
}
一旦脚本正常运行,我将在 $CSV_USERS=$CSV_USERS + $USERS 下添加以下几行
$USERS | Disable-AdAccount
$USERS | Move-AdObject -TargetPath "OU=Inactive employees,dc=contoso,dc=com"
有人能帮我找出为什么“| Where”参数对我不起作用吗?
答案1
我认为你把这件事搞得比实际更复杂了。不需要 for 循环来查找你的用户。拥抱 PowerShell 的力量吧!
Import-Module Active Directory
$thresholdDate = (get-date).AddDays(-90)
$oldUsers = get-aduser -filter * -searchbase "ou=Users,ou=middle,ou=top,dc=contoso,dc=com" -properties whenCreated,LastLogonDate |
where {$_.whenCreated -lt $thresholdDate -And $_.LastLogonDate -lt $thresholdDate}
$date=Get-Date -Format "dMy"
$path="C:\Scripts\TestScript_disable_users_$date.csv"
$oldUsers | export-CSV -notypeinformation $path
$oldUsers | DisableADAccount
只是要小心使用上次登录日期。该值仅每 12 天左右针对任何给定用户更新一次:http://windowsitpro.com/systems-management/use-get-aduser-find-inactive-ad-users
答案2
尚未测试,但这应该可以让你动起来。
Import-Module ActiveDirectory
$OU="ou=Users,ou=middle,ou=top,dc=contoso,dc=com"
$CSV_USERS=""
$OldUserAccts = ""
foreach ($x in $OU) {
Search-ADAccount -AccountInactive -Timespan 90.00:00:00 -Searchbase $x | foreach {
$user = get-aduser $_ -Properties whenCreated
if ($user.whenCreated -le ((Get-Date).AddDays(-90).toFileTime())) { $oldUSerAccts = $oldUserAccts + $User}
}
if ($OldUserAccts) {
$CSV_USERS=$CSV_USERS + $OldUserAccts
}
}
$date=Get-Date -Format "dMy"
$path="C:\Scripts\TestScript_disable_users_"+$date+".csv"
if($CSV_USERS) {
Out-File -FilePath $path -InputObject $CSV_USERS
}