2016-09-23 10 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または空です。 nullまたは空でない引数を指定してから、コマンドを再試行してください。 + CategoryInfo:InvalidData:(:) [取得-SCOMClassInstance]を、ParameterBindingValidationException + FullyQualifiedErrorId:ParameterArgumentValidationError、Microsoft.SystemCenter.OperationsManagerV10.Commands.GetSCClassInstanceCommand + PSComputerName:

scomserver用語 'スタート・serverScommaintenance' が認識されませんコマンドレット、関数、スクリプトファイル、または実行可能なプログラムの名前として使用します。名前のスペルを確認するか、パスに が含まれている場合は、パスが正しいことを確認してから、もう一度やり直してください。 + CategoryInfo:ObjectNotFound:(スタート-serverScommaintenance: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" 

答えて

0

argsで関数を呼び出すのではなく、関数を使うときに引数リストを渡す必要があると思います。

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

ハイベン私があなたが言及したように引数リストを使用すると、私は別のエラーを受け取ります。 コード: Invoke-Commandコマンド-Session $セッション-Scriptblock $ {関数:-serverScommaintenanceを開始} -ArgumentList -servername TESTSERVER -message "テスト" -maintmodeinMinutes '6' Erorr: Invoke-Commandコマンド:位置パラメータができません引数 'testserver'を受け付けることができます。 – Draaiboek

+0

引数リストを使用すると、関数を編集して位置によってパラメータを許可する必要があることを意味します。それから '-argumentlist" testserver "、" test "、" 6 "を渡します。 – BenH

関連する問題