Получить локальных администраторов на удаленном сервере, работая как задание - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть рабочий сценарий, который получает локальных администраторов на удаленных серверах, но иногда возникает проблема с одним из серверов в списке (даже если Test-Connection успешно), который зависает и останавливает продолжение сценария.Так что я искал использование заданий в качестве средства тайм-аута, если сервер слишком долго реагировал.

В моем тестовом сценарии я получаю список System.__ComObject объектов обратно,что выглядит многообещающе, но я не могу разобрать их, как обычно, и получить ошибку:

Exception calling "InvokeMember" with "5" argument(s): "Method
'System.Management.Automation.PSCustomObject.ADSPath' not found."
At c:\timeout.ps1:48 char:3
+         $member.GetType().Invokemember("ADSPath","GetProperty",$null, ...
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : MissingMethodException

ПРИМЕЧАНИЕ: для вышеуказанной ошибки она повторяется для Name, Class и ADSPath (в основном все вызовы, которые я пробовал.

Вот код скрипта:

# Test Timeout functionality
[CmdletBinding()]
Param(
    [Parameter(Mandatory=$true)][string]$Computer
)

$timeout = 90 ## seconds
$retryInterval = 5 ## seconds
$LocalGroupName = "Administrators"
$group = $null
$members = $null

Write-Host "Working on $($computer)..."

Write-Verbose "Start Job..."
$job1 = {
    Param($computer,$localgroupname)

    $group =[ADSI]"WinNT://$computer/$LocalGroupName"
    @($group.psbase.Invoke("Members"))
}
Start-Job -Name "Members" $job1 -ArgumentList $computer,$localgroupname

$Check_Job = Get-Job -Name "Members"
$timer = [Diagnostics.Stopwatch]::StartNew()

while ($timer.Elapsed.TotalSeconds -lt $Timeout) {
    if ($Check_Job.State -eq 'Completed') {
        $members = Receive-Job -Name "Members"
        break
    }

    Start-Sleep -Seconds $RetryInterval
    Write-Verbose -Message "Waiting [$totalSecs]sec until retry..."
}
$timer.Stop()

if (!$members) {
    Write-Host "No members found in the group"
} else {
    foreach($member in $members) {
        Write-Host "-------------------------------------"
        $member.GetType().InvokeMember("Name","GetProperty",$null,$member,$null)
        $member.GetType().InvokeMember("Class","GetProperty",$null,$member,$null)
        $member.GetType().InvokeMember("ADSPath","GetProperty",$null,$member,$null)
    }
}

Что я делаю не так?

...