0

システム アラートを SCOM 2012 に移行し、サーバーがオフラインになったときにハートビート アラートを受信します。現在、私が管理している vDC には約 750 台のサーバーがあります。SCOM 2012 サーバーは、別の信頼されていないドメインにあります。

サーバーをメンテナンス モードにする作業スクリプトが 1 つありますが、連続して実行され、約 400 台のサーバーをメンテナンス モードにするのに約 40 分かかります。これは実行可能な解決策ですが、 foreach -parallel コマンドを使用して高速化したいと考えています。

ワークフロー (foreach -parallel コマンドを使用するため) を作成し、ソース マシンとターゲット マシンの既定の PowerShell モジュールの場所の 1 つに配置しました。SCOM サーバーのワークフロー外で一連のコマンドをテストしたところ、正常に実行されました。Invoke-command を介してコマンドをリモートで実行しようとすると、SCOM コマンドが認識されないとして返されます。

#Get Date for usage in Connection Name
$Date = Get-Date -Format HHmmsss
#combine Name with Date to uniquify
$name = "ScomMM" + $Date

#Collect Servers from WSUS Server 
[reflection.assembly]::LoadWithPartialName("Microsoft.Updateservices.Administration") | out-null
$WSUS = [Microsoft.updateservices.administration.adminproxy]::Getupdateserver("ServerName",$false,8530);
$TS = $wsus.getcomputertargetgroups() | ? {($_.name -eq "Group1") -or ($_.Name -eq "Group2")}
$computers = $TS.getcomputertargets() | Select-Object FullDomainName

#Setup Trusted host 
invoke-Command -ScriptBlock {(winrm.cmd s winrm/config/client '@{TrustedHosts="*PublicIPAddress*"}')}
Enable-PSRemoting -Force
#Credentials stored in a file
$username = "username"
$password = get-content 'Path' | convertto-securestring
$creds = New-Object -TypeName System.Management.Automation.PSCredential -argumentlist $username,$password
$session = new-PSSession -ComputerName "IPAddress" -Credential $creds -Name $name

#SCOM Commands Module
Import-Module OperationsManager

#Workflow
Import-Module Set-MM

#Run the command remotely
Invoke-Command -Session $session -ScriptBlock {
    Import-Module -Name Set-MM
    Set-MM -computers $using:computers
}

#Workflow - Stored at C:\Windows\System32\WindowsPowerShell\v1.0\Modules\Set-MM\Set-MM.psm1
Workflow Set-MM
{
    Param($computers)
    Foreach -Parallel($computer in $computers)
    {
        Get-SCOMClassInstance -Name $computers.FullDomainName | Start-SCOMMaintenanceMode -EndTime (Get-Date).AddMinutes(6) -Reason PlannedOperatingSystemReconfiguration
    }
}

At C:\Windows\system32\WindowsPowerShell\v1.0\Modules\Set-MM\Set-MM.psm1:6 char:3
+         Get-SCOMClassInstance -Name $computers.FullDomainName | Start ...
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Cannot find the 'Get-SCOMClassInstance' command. If this command is defined as a workflow, ensure it is 
defined before the workflow that calls it. If it is a command intended to run directly within Windows 
PowerShell (or is not available on this system), place it in an InlineScript: 'InlineScript { 
Get-SCOMClassInstance }'
    + CategoryInfo          : ParserError: (:) [], ParseException
    + FullyQualifiedErrorId : CommandNotFound
    + PSComputerName        : IPAddress

The term 'Set-MM' is not recognized as the name of a cmdlet, function, script file, or operable program. 
Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
    + CategoryInfo          : ObjectNotFound: (Set-MM:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException
    + PSComputerName        : IPAddress    

        Get-PSSession | Remove-PSSession

foreach -Parallel 内のスクリプトで Inlinescript を使用する場合

InlineScript{Get-SCOMClassInstance -Name $Using:computers.FullDomainName | Start-SCOMMaintenanceMode -EndTime (Get-Date).AddMinutes(6) -Reason PlannedOperatingSystemReconfiguration}

ワークフローで処理しようとしているコンピューターごとにこれを取得します。

The term 'Get-SCOMClassInstance' is not recognized as the name of a cmdlet, function, script file, or 
operable program. Check the spelling of the name, or if a path was included, verify that the path is 
correct and try again.
    + CategoryInfo          : ObjectNotFound: (Get-SCOMClassInstance:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException
    + PSComputerName        : ServerName
4

0 に答える 0