用于禁用OU中过期用户的Powershell脚本

用于禁用OU中过期用户的Powershell脚本,powershell,active-directory,Powershell,Active Directory,我一直在尝试创建一个Powershell脚本来禁用已过期的帐户(AccountExpires) 这会生成一个有到期日期的帐户列表,但我似乎无法生成一个已经过期的帐户列表,那么如何一次性禁用它们 谢谢虽然您可以执行获取ADUser-Filter*并在客户端过滤掉帐户,但每次都会通过网络传输广告中的所有用户对象,但您会立即丢弃99%的用户对象。当目录中有许多用户对象时,这有点浪费 我更喜欢让服务器端过滤对象,这可以通过LDAP过滤器实现。“所有已启用的过期帐户”的筛选器如下所示: (& (Accou

我一直在尝试创建一个Powershell脚本来禁用已过期的帐户(AccountExpires)

这会生成一个有到期日期的帐户列表,但我似乎无法生成一个已经过期的帐户列表,那么如何一次性禁用它们


谢谢

虽然您可以执行
获取ADUser-Filter*
并在客户端过滤掉帐户,但每次都会通过网络传输广告中的所有用户对象,但您会立即丢弃99%的用户对象。当目录中有许多用户对象时,这有点浪费

我更喜欢让服务器端过滤对象,这可以通过LDAP过滤器实现。“所有已启用的过期帐户”的筛选器如下所示:

(&
(AccountExpires>=1)

(AccountExpires=1
AccountExpires您似乎想要确定用户子集的帐户过期状态。然后您想要禁用已经过期的用户。下面的代码应该可以帮助您更接近您的目标

$CurrentTime = (Get-Date).ToFileTime()
$CalculatedProperty = @{
    Label='AccountExpires'
    Expression = { if (!$_.AccountExpires -or $_.AccountExpires -ge [datetime]::MaxValue.ToFileTime()) {
                       "Never"
                   } 
                   elseif ($_.AccountExpires -le $CurrentTime) {
                       "Expired"
                   }
                   else { 
                       [datetime]::FromFileTime($_.AccountExpires)
                   }
                 }
}

$users = Get-ADUser -filter "Enabled -eq '$true'" -SearchBase "OU Goes Here" -Properties AccountExpires |
    Select-Object SamAccountName,Name,$CalculatedProperty
$users | Where AccountExpires -eq 'Expired' | Foreach-Object {
    Disable-ADAccount -Identity $_.SamAccountName -WhatIf
}

$users
将包含所有用户对象和帐户过期状态。如果您对结果满意,则需要删除
-WhatIf
参数。如果运行
$users | Where AccountExpires-eq'Expired'
,您将看到哪些帐户将成为禁用的目标。

条件
$\uuNexpires-和$\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\。
$filterString = "
(&
    (AccountExpires>=1)
    (AccountExpires<=$([DateTime]::Now.ToFileTime()))
    (!(UserAccountControl:1.2.840.113556.1.4.803:=2))
)" -replace "`r`n"

Get-ADUser -LDAPFilter $filterString | Disable-ADAccount -WhatIf
$CurrentTime = (Get-Date).ToFileTime()
$CalculatedProperty = @{
    Label='AccountExpires'
    Expression = { if (!$_.AccountExpires -or $_.AccountExpires -ge [datetime]::MaxValue.ToFileTime()) {
                       "Never"
                   } 
                   elseif ($_.AccountExpires -le $CurrentTime) {
                       "Expired"
                   }
                   else { 
                       [datetime]::FromFileTime($_.AccountExpires)
                   }
                 }
}

$users = Get-ADUser -filter "Enabled -eq '$true'" -SearchBase "OU Goes Here" -Properties AccountExpires |
    Select-Object SamAccountName,Name,$CalculatedProperty
$users | Where AccountExpires -eq 'Expired' | Foreach-Object {
    Disable-ADAccount -Identity $_.SamAccountName -WhatIf
}