Как использовать Powershell для резкого поиска в структуре отчетов пользователей для первого включенного менеджера - PullRequest
0 голосов
/ 02 апреля 2020

Работа над HR-проектом на работе для обработки пользовательских завершений с помощью кода PS. Текущая задача заключается в следующем: 1. Проверить учетную запись пользователя, если она включена / отключена. 2. Если отключено, проверьте SAMAccount их менеджера, если включено / отключено. 3. Повторяйте до тех пор, пока учетная запись не будет найдена включенной. 4. Верните SAMAccount этой учетной записи.

Рабочий код на данный момент:

$testuser = "johndoe"
If ($(get-aduser $testuser).enabled -eq $true{
$usermgr1 = get-aduser $testuser -properties * | select @{Name='Manager';Expression={(Get-ADUser $_.Manager).SAMAccountName}}
}

Вывод вышеуказанного отформатирован, как показано ниже. Я определенно не хочу заголовок.

Manager
------
JaneDoe

Затем я попытался расширить это до первого теста, проверяя, включена ли учетная запись менеджера:

If ($get-aduser $usermgr1).enabled -eq $true) | select @{Name='Manager';Expression={(Get-ADUser $_.Manager).SAMAccountName}}
Else Write-Host "Manager Account  Disabled"
}

Это попытка возвращает ошибку:

Get-ADUser : Cannot validate argument on parameter 'Identity'. The Identity property on the argument is null or empty.
At line:4 char:18
 + If ($(get-aduser $usermgr1).enabled -eq $true){write-host "Enabled"}

Ожидаемый вывод здесь - это SAMAccount менеджера этого пользователя, если он включен; если отключено, я бы продолжил добавлять больше кодов до четырех или пяти Я еще не знаю достаточно PowerShell для l oop назад и динамического повторного тестирования, чтобы избежать его жесткого кодирования.

-EDIT-

Используя пример itchydon, я решил ограничить рекурсия на два уровня выше целевого пользователя. Вероятность одновременного отключения трех или более уровней мала. Поэтому рабочий код:

$testuser = "janedoe"
$user = get-aduser $testuser -properties manager
    if ($user.enabled -eq $false){
    $usermgr1 = get-aduser $user.manager
        if ($usermgr1.enabled -eq $true){Write-Host $usermgr1.SamAccountName}
            else{
            $user1 = get-aduser $usermgr1 -properties manager
            if ($user1.enabled -eq $false){
                $usermgr2 = get-aduser $user1.manager
                if ($usermgr2.enabled -eq $true){
                Write-Host $usermgr2.SamAccountName}
                else{Write-Host "Recursion cannot complete. Handle manually."}
                }
            }
}

-EDIT-

Теперь с рабочим кодом пытаемся установить свойства почтового ящика с теми же логами c. Что я заметил, так это то, что команда set-mailbox выполняется в первом тесте, независимо от того, отключен менеджер или нет:

if ($user.enabled -eq $false){
            $usermgr1 = get-aduser $user.manager
            if ($usermgr1.enabled -eq $true){
            $mgr1 = $usermgr1.SamAccountName
            $mgr1email = get-aduser $mgr1 -properties EmailAddress
            $mgr1email.emailaddress
            }
        Set-Mailbox $testuser -ForwardingAddress $mgr1email.EmailAddress -DeliverToMailboxAndForward $False
        Set-MailboxAutoReplyConfiguration -identity $testuser -AutoReplyState Enabled -InternalMessage $internal -ExternalMessage $external
        Write-Host $testuser "Completed"
       }
        else{

В этом случае проверяется, $ usermgr1.enabled -eq $ Значение true завершается ошибкой, и я ожидаю, что команды set-mailbox будут полностью пропущены, перейдя к оператору else {.

. Я подумал, что это просто вопрос перемещения команд внутри объявления теста следующим образом:

   if ($user.enabled -eq $false){
            $usermgr1 = get-aduser $user.manager
            if ($usermgr1.enabled -eq $true){
            $mgr1 = $usermgr1.SamAccountName
            $mgr1email = get-aduser $mgr1 -properties EmailAddress
            $mgr1email.emailaddress
            Set-Mailbox $testuser -ForwardingAddress $mgr1email.EmailAddress -DeliverToMailboxAndForward $False
            Set-MailboxAutoReplyConfiguration -identity $testuser -AutoReplyState Enabled -InternalMessage $internal -ExternalMessage $external
            Write-Host $testuser "Completed"
            }
       }
        else{

Однако конечный результат этого, когда включенный тестовый тест проходит, состоит в том, что команды set-mailbox пропускаются полностью, и никаких действий не предпринимается вообще.

-EDIT- Исправлено Проблема с командами почтового ящика, оставляя объявления переменных в их собственном блоке следующим образом:

$user = get-aduser $testuser -properties manager
    if ($user.enabled -eq $false){
            $usermgr1 = get-aduser $user.manager
            $mgr1 = $usermgr1.SamAccountName
            $mgr1email = get-aduser $mgr1 -properties EmailAddress}

    if ($usermgr1.enabled -eq $true){
            Set-Mailbox $testuser -ForwardingAddress $mgr1email.EmailAddress -DeliverToMailboxAndForward $False
            Set-MailboxAutoReplyConfiguration -identity $testuser -AutoReplyState Enabled -InternalMessage $internal -ExternalMessage $external
            Write-Host $testuser "Completed"
            }

1 Ответ

1 голос
/ 02 апреля 2020

Я не могу проверить это, к сожалению, но я думаю, что это то, что вам нужно.

$testuser = "johndoe"    
$user = get-aduser $testuser -properties manager
if ($user.enabled -eq $true){
    $usermgr1 = get-aduser $user.manager
    if ($usermgr1.enabled -eq $false){
        Write-Host "Manager Account  Disabled"
    }
    else{
        write-host $usermgr1.samaccountname
    }
}

В приведенном выше, вместо того, чтобы продолжать делать get-aduser, мы делаем это один раз для testuser и сохраняем его в переменную ($user). Затем мы можем получить доступ к каждому свойству объекта - поэтому мы используем его для проверки включенного состояния, как показано, например, $user.enabled -eq $true. Если это правда - сделайте еще один get-aduser для информации менеджера, используя ту же технику

...