Скрипт Powershell для отключения просроченных пользователей в OU - PullRequest
0 голосов
/ 24 января 2020

Я пытался создать скрипт Powershell для отключения учетных записей, срок действия которых истек (AccountExpires).

Import-Module ActiveDirectory
Get-ADUser -filter * -SearchBase "OU Goes Here" -Properties AccountExpires, Enabled | Where-Object {$_.Enabled -eq $True} | ForEach {
        If (($_.accountExpires -gt [DateTime]::MaxValue.Ticks) -or ($_.accountExpires -eq 0)) {$ActExp = "Never"}
        Else {$ActExp = [datetime]::FromFileTime($_.accountexpires)}
        "$_.Name,$ActExp"
    }
Select-Object name,@{Name="AccountExpires";Expression={[datetime]::FromFileTime($_.properties."AccountExpires")}}

При этом создается список учетных записей, срок действия которых истекает, но мне кажется, что я не могу создать список учетных записей, срок действия которых уже истек, и как я могу отключить их все в один go?

Спасибо

Ответы [ 2 ]

0 голосов
/ 24 января 2020

Похоже, вы хотите определить срок действия учетной записи для подмножества пользователей. Затем вы хотите отключить пользователей, которые уже истекли. Код ниже должен помочь вам приблизиться к вашей цели.

$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', вы увидите, какие учетные записи будут отключены.

0 голосов
/ 24 января 2020

Хотя вы можете выполнить Get-ADUser -Filter *, а затем отфильтровать учетные записи на стороне клиента, это каждый раз передает по сети все пользовательские объекты из AD, но вы немедленно отбрасываете 99% из них. Когда в каталоге много пользовательских объектов, это пустая трата.

Я бы предпочел позволить серверной стороне фильтровать объекты, чего можно добиться с помощью фильтра LDAP. Фильтр для «все просроченные учетные записи, которые включены» будет выглядеть следующим образом:

(&
    (AccountExpires>=1)
    (AccountExpires<=637154628247641991)
    (!(UserAccountControl:1.2.840.113556.1.4.803:=2))
)

т.е. AccountExpires>=1 И AccountExpires<={current date} И НЕ Account is disabled. Последняя часть выглядит несколько запутанной, но не слишком сложной:

В PowerShell мы можем настроить и использовать этот фильтр следующим образом. Отключение уязвимых учетных записей - это всего лишь вопрос передачи их в Disable-ADAccount

$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

. -replace "`r`n" необходим только потому, что Get-ADUser требователен к символам новой строки в строке фильтра LDAP.

...