2016-09-23 7 views
0

우리는 원격 유지 관리 모드로 서버를 넣어하려는이 질문에 (Cannot set SCOM maintenance mode remotely)는 SCOM의 유지 관리 모드를 원격으로 (파트 2)

로부터 다음을 설정할 수 없습니다. 톰 슈마허에 의해 생성 SCOM 기능을 사용하고 있습니다 (https://gallery.technet.microsoft.com/scriptcenter/Put-server-in-Maintenance-0a23e1fe)

나는 시도하고 SCOM 서버가 아닌 다른 서버에서 유지 관리 모드에서 서버를 넣어 PSSession을 사용하고

:

. 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'매개 변수의 인수를 확인할 수 없습니다. 인수가 널이거나 비어 있습니다. 널 (null) 또는 비어 있지 않은 인수를 제공 한 후 명령을 다시 시도하십시오. + CategoryInfo : InvalidData : (:) 는 FullyQualifiedErrorId +, ParameterBindingValidationException [-SCOMClassInstance를하기] : ParameterArgumentValidationError, Microsoft.SystemCenter.OperationsManagerV10.Commands.GetSCClassInstanceCommand +에는 PsComputerName :

용어는 '시작 - serverScommaintenance'scomserver 인식되지 않습니다 cmdlet, 함수, 스크립트 파일 또는 작동 가능 프로그램의 이름으로 사용합니다. 이름의 철자를 확인하거나 경로에 이 포함되어 있으면 경로가 올바른지 확인하고 다시 시도하십시오. + CategoryInfo : ObjectNotFound (스타트 serverScommaintenance : 문자열)] 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" 

답변

0

args를 사용하여 함수를 다시 호출하는 대신 함수를 사용할 때 인수 목록을 인수로 전달해야한다고 생각합니다.

Invoke-Command -Session $s -Scriptblock ${function:Start-serverScommaintenance} -argumentlist #argshere 
+0

안녕 벤, w 암탉 내가 언급 한 인수 목록을 사용하면 다른 오류가 나타납니다. 코드 : 호출 - 명령 - 세션 $ 세션 -scriptblock $ {기능 : 시작 - serverScommaintenance} -argumentlist -servername TESTSERVER는 -message "테스트"-maintmodeinMinutes '6' Erorr : 호출-명령 : 위치 매개 변수는 할 수 없습니다 인자 'testserver'를 받아들이는 것으로 발견된다. – Draaiboek

+0

인수 목록을 사용하면 함수를 편집하여 위치별로 매개 변수를 허용해야합니다. 그런 다음'-argumentlist "testserver", "test", "6"을 전달합니다. – BenH