У меня есть рабочий сценарий, который получает локальных администраторов на удаленных серверах, но иногда возникает проблема с одним из серверов в списке (даже если 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)
}
}
Что я делаю не так?