Невозможно установить режим обслуживания SCOM удаленно (Часть 2)

Следуя этому вопросу (Невозможно установить режим обслуживания SCOM удаленно)

Мы пытаемся перевести серверы в режим обслуживания удаленно. Я использую функции SCOM, созданные Томом Шумахером (https://gallery.technet.microsoft.com/scriptcenter/Put-server-in-Mainmaintenance-0a23e1fe)

Я использую PSSession, чтобы попытаться перевести сервер в режим обслуживания с сервера, отличного от сервера SCOM:

. C:\Scripts\Start-serverScommaintenance.ps1
$s = New-PSSession -ComputerName scomserver
Invoke-Command -Session $s -Scriptblock {Import-Module OperationsManager}
Invoke-Command -Session $s -Scriptblock ${function:Start-
serverScommaintenance} 
Invoke-Command -Session $s -Scriptblock {Start-serverScommaintenance -
servername testserver -message "test" -maintmodeinMinutes '6'}

Когда я перехожу к функции, я получаю следующие ошибки:

Невозможно проверить аргумент параметра DisplayName. Аргумент нулевой или пустой. Укажите аргумент, который не может быть пустым или пустым, а затем попробуйте выполнить команду еще раз. + CategoryInfo: InvalidData: (:) [Get-SCOMClassInstance], ParameterBindingValidationException + FullyQualifiedErrorId: ParameterArgumentValidationError, Microsoft.SystemCenter.OperationsManagerV10.Commands.GetSCClassInstanceCommand + PSComputerName:

Термин «Обслуживание Start-server» не распознается как имя командлета, функции, файла сценария или работающей программы. Проверьте написание имени или, если был включен путь, убедитесь, что путь правильный, и повторите попытку. + CategoryInfo: ObjectNotFound: (Start-serverScommainamination: String) [], CommandNotFoundException + FullyQualifiedErrorId: CommandNotFoundException + PSComputerName: scomserver

Вот копия функции, используемой для справки:

function Start-ServerScommaintenance
{
param([string] $servername = 'yourServerGoeshere',
   [string]$message = "Putting: $servername into Maintenance Mode via     automation",
   [int]$maintModeinMinutes = '60')

$funcName = 'func - Start-ServerScommaintenance:'
if(get-command -Name 'Get-SCOMClassInstance')
{
    $server = (Get-SCOMClassInstance -DisplayName "$servername*") | select -first 1 | select -ExpandProperty Displayname
    $scommanagementServers = (Get-SCOMManagementServer).displayName
    if($scommanagementServers -ccontains $server)
    {
        Write-Warning "$funcname contains a Management Server $server.. You cannot put a management server in Maintenance Mode!!!"
    }
    else
    {
        $time = ((get-date).AddMinutes($maintModeinMinutes))
        $serverClassIds = Get-SCOMClassInstance -DisplayName $server
        foreach($classid in $serverClassIds)
        {
            $server1 = Get-SCOMClassInstance -id ($classid.id) | Where-Object{$_.DisplayName -match $server}
            write-host "$funcName putting " ($server1.id) ' in maintenance Mode Servername -->' ($Server1.DisplayName)
            if(!(Get-SCOMMaintenanceMode -Instance $classid))
            {
                Start-SCOMMaintenanceMode -Instance $server1 -EndTime $time -reason PlannedOther -Comment $message
            }
            else
            { Write-host "$funcname " $classid.id " has already been placed in Maintenance Mode"}
        }
    }
}
    else
    { Write-host "$funcname doesn't have the Operationsmanager module imported for this session"}
}

function Stop-ServerScommaintenance
{
param([string] $servername = 'yourServerGoeshere',
   [string]$message = "Removing Maintenance Mode from: $servername via     automation"
   )
$funcName = 'func - Stop-ServerScommaintenance:'
if(get-command -Name 'Get-SCOMClassInstance')
{
    $server = (Get-SCOMClassInstance -DisplayName "$servername*") | select -    first 1 | select -ExpandProperty Displayname
    $scommanagementServers = (Get-SCOMManagementServer).displayName
    if($scommanagementServers -ccontains $server)
    {
        Write-Warning "$funcname contains a Management Server $server.. You     cannot put a management server in Maintenance Mode!!!"
    }
    else
    {
        $serverClassIds = Get-SCOMClassInstance -DisplayName $server
        foreach($classid in $serverClassIds)
        {
            $server1 = Get-SCOMClassInstance -id ($classid.id) | Where-    Object{$_.DisplayName -match $server}
            write-host "$funcName removing " ($server1.id) ' in maintenance     Mode Servername -->' ($Server1.DisplayName)
            $result = (Get-SCOMClassInstance -id ($classid.id)|Where-Object{$_.Displayname -like $servername}).StopMaintenanceMode((get-date).ToUniversalTime())
        }
    }
}
else
{ Write-host "$funcname doesn't have the Operationsmanager module imported for this session"}
}
#Start-serverScommaintenance -servername Server1 -message "my message" -maintmodeinMinutes '30' 
#Stop-ServerScommaintenance -servername Server1 -message "my message"  

person Draaiboek    schedule 23.09.2016    source источник


Ответы (1)


Я считаю, что вам нужно передавать вещи с помощью списка аргументов, когда вы используете функцию, а не снова вызывать функцию с аргументами:

Invoke-Command -Session $s -Scriptblock ${function:Start-serverScommaintenance} -argumentlist #argshere
person BenH    schedule 23.09.2016
comment
Привет, Бен, когда я использую список аргументов, как ты упомянул, я получаю другую ошибку. Код: Invoke-Command -Session $ session -Scriptblock $ {function: Start-serverScommainasted} -argumentlist -servername testserver -message test -maintmodeinMinutes '6' Erorr: Invoke-Command: не найден позиционный параметр, который принимает аргумент 'testserver' . - person Draaiboek; 26.09.2016
comment
Использование списка аргументов означало бы, что вам нужно будет отредактировать вашу функцию, чтобы разрешить параметры по позиции. Затем вы должны передать `-argumentlist testserver, test, '6'. - person BenH; 26.09.2016