19

リモートランスペースに接続するために私が知っている唯一の方法には、次のパラメーターが含まれます

   WSManConnectionInfo connectionInfo = 
     new WSManConnectionInfo(false, "localhost", 80, "/Powershell", "http://schemas.microsoft.com/powershell/Microsoft.Exchange", credential);

また

   WSManConnectionInfo connectionInfo = 
     new WSManConnectionInfo(false, "localhost", 5985, "/wsman", "http://schemas.microsoft.com/powershell/Microsoft.Powershell", credential);
  • HTTPを介して公開できるように独自のカスタムPowershellオブジェクトを設定するにはどうすればよいですか?

  • 使用する正しいパラメータは何ですか?また、それらを設定するにはどうすればよいですか?

4

1 に答える 1

20

これにはいくつかの部分があるので、それらを別々に説明してから、それらをまとめます。

暗黙のリモーティング

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-ModulePowerShellコマンドレットが含まれているかどうかに関係なく、コンパイルされた.NETアセンブリをロードするために使用できます。

たとえば、パブリッククラスを作成してDLLにコンパイルした場合、それを実行できImport-Module MyAssembly.dll、そのクラスがPowerShellセッションで使用できるようになります。

C#でコマンドレットを定義するということは、またはSystem.management.Automationから継承するクラスへの参照を含めてから作成することを意味します。CmdletPSCmdlet

モジュールマニフェストを定義することをお勧めしますが、スクリプトモジュールの場合と同様に、技術的にはオプションです。

ただし、セッション構成情報をアセンブリに含めていません(まだ?)。また、その方法についてのリファレンスも見ていません。

それをまとめる

手順はおおよそ次のようになります。

  1. モジュールをコンパイルしてリモートエンドで使用できるようにし、そのマシンのローカルセッションからPowerShellにインポートできるようにします。
  2. 新しいPSSession構成ファイルを作成し、いずれか-AssembliesToLoadまたは-ModulesToImport(または必要に応じて両方)を指定するか、アセンブリ自体で構成情報を指定します(おそらくここで推奨されます)。
  3. マシンに構成を登録します。
  4. クライアント側では、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

ただし、セッション構成を使用して追加のカスタマイズと制御が必要になる場合があるので、それはあなた次第です。それが交換のやり方ですが、あなたの目的にはやり過ぎかもしれません。

于 2015-05-05T19:00:59.663 に答える