Поймать - Блокировка всей петли - PullRequest
0 голосов
/ 26 апреля 2019

Я выполняю скрипт Powershell для извлечения badpwdcount на каждом контроллере домена AD. Есть около 50 контроллеров домена. При запуске сценария невозможно связаться с одним из серверов. Сценарий должен записать неудачную попытку подключения и продолжить. Тем не менее сценарий завершается после неудачной попытки подключения.

Param(
                $BadOption,
                $Samaccountname = "<accountname>"
)
Import-Module ActiveDirectory

$result = @()
try {
    $DC = Get-ADDomainController -Filter * | select -exp hostname
    $DC1 = $DC -notlike { "<DC Server>", "<DC Server1>" } # skipping few

    foreach ($Domaincontroller in $DC1) {


        $count = Get-ADUser -Identity $Samaccountname -Server $Domaincontroller -Properties badPwdCount | select badPwdCount
        $result += $Domaincontroller + ',' + $count

    }
    #echo $result

}
catch {
    $errmsg = $_.Exception.Message
    $result += $Domaincontroller + ' :' + "Error : " + $errmsg
}

return $result

Ответы [ 3 ]

1 голос
/ 26 апреля 2019

Как в этом:

$result = @()

$DC = Get-ADDomainController -Filter * | select -exp hostname
$DC1 = $DC -notlike {"<DC Server>","<DC Server1>"} # skipping few

ForEach($Domaincontroller in $DC1) {
    Write-Host $Domaincontroller
    Try {
        $count = Get-ADUser -Identity $Samaccountname -Server $Domaincontroller -Properties badPwdCount | select badPwdCount
        $result += $Domaincontroller + ',' + $count
    }
    Catch{
        $errmsg = $_.Exception.Message
        $result += $Domaincontroller + ' :'+ "Error : "+$errmsg
    }
}
Return $result
1 голос
/ 26 апреля 2019

Почему бы не добавить тест в цикл, чтобы проверить, доступен ли контроллер домена?

# An array of DC hostnames you want to exclude
$Exclude = "<DC Server>","<DC Server1>"

# By setting $ErrorActionPreference to Stop, PowerShell treats all non-terminating errors as terminating.
# This is useful when using try{..} catch{..} blocks.
$oldErrorAction = $ErrorActionPreference
$ErrorActionPreference = 'Stop'

$result = @()
$DC = Get-ADDomainController -Filter * | Select-Object -ExpandProperty hostname | Where-Object { $Exclude -notcontains $_ }

foreach($Domaincontroller in $DC) {
    if (Test-Connection -ComputerName $Domaincontroller -Count 1 -Quiet) {
        try {
            $count  = (Get-ADUser -Identity $Samaccountname -Server $Domaincontroller -Properties badPwdCount).badPwdCount
            $result += "$Domaincontroller, $count"
        }
        catch {
            $errmsg = $_.Exception.Message
            $result += "$Domaincontroller :Error : $errmsg"
        }
    }
    else {
        $result += "$Domaincontroller :Error : Failed connection attempt"
    }
}
# Restore the previous value for the $ErrorActionPreference variable
$ErrorActionPreference = $oldErrorAction

$result
1 голос
/ 26 апреля 2019

Оператор Continue должен позволить вам продолжать обработку после завершения ошибок в блоке Try-Catch.

$result = @()
$DC = Get-ADDomainController -Filter * | select -exp hostname
$DC1 = $DC -notlike {"<DC Server>","<DC Server1>"} # skipping few

foreach($Domaincontroller in $DC1)
{
    try
    {
            $count = Get-ADUser -Identity $Samaccountname -Server $Domaincontroller -Properties badPwdCount | select badPwdCount
            $result += $Domaincontroller + ',' + $count

    }

    catch {
            $errmsg = $_.Exception.Message
            $result += $Domaincontroller + ' :'+ "Error : "+$errmsg
            Continue
    }
}
$result
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...