これにはいくつかの部分があるので、それらを別々に説明してから、それらをまとめます。
暗黙のリモーティング
ExchangeはImplicitRemotingを使用しています。
それが機能する方法は、リモートマシンへのPSSessionを確立してから、リモートインスタンスから利用可能なコマンドのいくつかを自分のインスタンスにインポートすることです。
これは、Import-Module -Session $session
またはを使用して行われImport-PSSession
ます。
これは、Powershellで純粋に試すことができます。Active Directory RSATがインストールされていない(ActiveDirectory powershellコマンドレットがインストールされていない)ワークステーションを使用してから、インストールされているマシンに接続します(これを呼び出しますDC1
)。
$s = New-PSSession -ComputerName DC1
Invoke-Command -Session $s -ScriptBlock { Import-Module ActiveDirectory }
Import-PSSession -Session $s -Module ActiveDirectory
呼び出しを1つのモジュールのみに制限すると、Import-PSSession
それらのコマンドレットのみをインポートできます。この時点でGet-ADComputer
、たとえば、実際の呼び出しがで行われている場合でも、ローカルで使用可能であるかのように実行できますDC1
。
セッション構成
PowerShell Remoting接続を行うと、セッション構成に接続することになります。指定しない場合は、と呼ばれるものに接続しますMicrosoft.PowerShell
。マシンで定義されているすべての構成を確認するには、を呼び出しますGet-PSSessionConfiguration
。他にもいくつか表示される場合があります。たとえばMicrosoft.PowerShell32
、32ビットのPowerShellセッションに接続する方法です。
特定の構成に接続するには、New-PSSession -ConfigurationName
またはを使用しますNew-PSSession -ConnectionUri
。
セッション構成の定義
セッション構成では多くのものを指定できます。PowerShellのバージョン、モジュールが事前にインポートされているビット数、関数とコードを事前に定義できる、言語機能が使用できないようにするなど。
この回答は、独自の構成を作成する方法の概要を示しています。
構成情報をアセンブリ内に配置することもできます。これは、実行しようとしていることに対して適切に機能します。
モジュールでコードをラップする
これまで見てきたImport-PSSession
ように、モジュールに存在する場合は、必要なコードだけをインポートする方が簡単です。したがって、コマンドレットがモジュールを介して公開されていることを確認する必要があります。
コメントで、コマンドレットをC#で記述したいとおっしゃいました。これは私が行ったことではありませんが、この記事では、C#でPowerShellモジュールを作成する方法の詳細な手順を説明しているようです。
これは今私がやったことです(そしてその記事は良いです)。C#でコマンドレットを作成することは、暗黙的に、すでにモジュールです。実際、Import-Module
PowerShellコマンドレットが含まれているかどうかに関係なく、コンパイルされた.NETアセンブリをロードするために使用できます。
たとえば、パブリッククラスを作成してDLLにコンパイルした場合、それを実行できImport-Module MyAssembly.dll
、そのクラスがPowerShellセッションで使用できるようになります。
C#でコマンドレットを定義するということは、またはSystem.management.Automation
から継承するクラスへの参照を含めてから作成することを意味します。Cmdlet
PSCmdlet
モジュールマニフェストを定義することをお勧めしますが、スクリプトモジュールの場合と同様に、技術的にはオプションです。
ただし、セッション構成情報をアセンブリに含めていません(まだ?)。また、その方法についてのリファレンスも見ていません。
それをまとめる
手順はおおよそ次のようになります。
- モジュールをコンパイルしてリモートエンドで使用できるようにし、そのマシンのローカルセッションからPowerShellにインポートできるようにします。
- 新しいPSSession構成ファイルを作成し、いずれか
-AssembliesToLoad
または-ModulesToImport
(または必要に応じて両方)を指定するか、アセンブリ自体で構成情報を指定します(おそらくここで推奨されます)。
- マシンに構成を登録します。
- クライアント側では、PowerShellで使用できるようにする必要があるため、セッションを作成してからインポートするだけです。
$s = New-PSSession -ComputerName RemoteMachine -ConfigurationName MyConfig
# The configuration was defined in such a way
# that your module will already be imported in the remote session.
Import-PSSession -Module MyModule
それを単純化する?
リモート側でカスタム構成を作成する必要はありません。モジュールがリモートマシン上のすべてのPowerShellセッションで使用可能である限り、セッション構成手順をスキップできます。そうすれば、次のようになります。
$s = New-PSSession -ComputerName RemoteMachine
Invoke-Command -Session $s -ScriptBlock { Import-Module MyModule }
Import-PSSession -Session $s -Module MyModule
ただし、セッション構成を使用して追加のカスタマイズと制御が必要になる場合があるので、それはあなた次第です。それが交換のやり方ですが、あなたの目的にはやり過ぎかもしれません。