1

C#ランスペースを介してリモートマシンに存在するモジュールをインポートできる必要があります。

これが何を意味するのかを明確にするために:私が作成しているサービスはサーバーAにあります。それは以下の方法を使用してサーバーBへのリモートランスペースを作成します。ランスペースを介して、サーバーBにモジュールをインポートしようとしています。

リモート呼び出しを行うために使用しているメソッドは次のとおりです。

internal Collection<PSObject> RunRemoteScript(string remoteScript, string remoteServer, string scriptName, out bool scriptSuccessful)
    {
        bool isLocal = (remoteServer == "localhost" || remoteServer == "127.0.0.1" || remoteServer == Environment.MachineName);

        WSManConnectionInfo connectionInfo = null;

        if (!isLocal)
        {
            connectionInfo = new WSManConnectionInfo(new Uri("http://" + remoteServer + ":5985"));
        }

        PsHostImplementation myHost = new PsHostImplementation(scriptName);

        using (Runspace remoteRunspace = (isLocal ? RunspaceFactory.CreateRunspace(myHost) : RunspaceFactory.CreateRunspace(myHost, connectionInfo)))
        {
            remoteRunspace.Open();
            using (PowerShell powershell = PowerShell.Create())
            {
                powershell.Runspace = remoteRunspace;

                Pipeline pipeline = remoteRunspace.CreatePipeline();

                pipeline.Commands.AddScript(remoteScript);

                Collection<PSObject> results = pipeline.Invoke();

                remoteRunspace.Close();

                scriptSuccessful = myHost.ScriptSuccessful;
                return results;
            }
        }
    }

「remoteScript」は、実行したいPowershellスクリプトに設定されています。例えば:

"Import-Module Modulename;CustomCommand-FromModule -parameter(s) -ErrorAction stop"

モジュールは一緒にパックされていません。psd1、psm1、およびリモートサーバー(サーバーB)のC:\\ PowerShell \ ModuleNameにある一連のスクリプトファイルであり、ModuleNameを呼び出していることをテストして確認しました。 C:\\ PowerShell\ModuleNameディレクトリにあるpsd1ファイル。

ModuleName.psd1ファイル内には、次の行があります。

ModuleToProcess = 'ModuleName.psm1'

ただし、C#の実行スペースで実行しようとすると、非常に奇妙なエラーが発生します。

「remoteScript」へのパラメータとして以下を送信すると、次のようになります。

"Import-Module Modulename"

次のエラーが発生します。

System.Management.Automation.RemoteException:モジュールマニフェスト「C:\ PowerShell \ ModuleName \ ModuleName.psd1」のフィールド「ModuleToProcess」にリストされている「ModuleName.psm1」を処理するモジュールは、有効なモジュールが見つからなかったため、処理されませんでしたモジュールディレクトリ。

モジュールは「$env:PSModulePathの場所の1つに存在し、次を実行すると表示されます。

get-module -listAvailable

また、psd1ファイル内にModuleName.psm1ファイルへの完全修飾パスを挿入してみました。私がそれを行うと(または以下のx0nによって提案されたもの)、ほぼまったく同じエラーが発生します:

モジュールマニフェスト「C:\ PowerShell \ ModuleName \ ModuleName.psd1」のフィールド「ModuleToProcess」にリストされている「C:\ PowerShell \ ModuleName \ ModuleName.psm1」を処理するモジュールは、どのモジュールにも有効なモジュールが見つからなかったため、処理されませんでしたディレクトリ。

この時点で、どこに行けばいいのか、あるいはこれが実際に可能であるとしても、私にはよくわかりません。私はいたるところを検索して、関連しているように見えるものをいくつか見つけましたが、まったく同じではなく、すでに克服した、または(私の知る限り)まだ直面していない問題になる傾向がありました。どんな助けでもいただければ幸いです!ありがとう!

4

3 に答える 3

1

私はあなたが2つのことをする必要があると思います:

  1. ファイルへの絶対パスを使用し.psd1ます。それ以外の場合は、で見つかったモジュールのみ$env:PSModulePathが考慮されます(ロードを実行するスクリプトが実行されている場所は重要ではありません)。

  2. リモートスクリプトをロードできることを確認してください。デフォルトまたはRemoteSigned実行ポリシーは、署名されていない限り、リモートスクリプトをブロックします。

于 2012-04-25T13:10:04.607 に答える
1

モジュールが新しい.netランタイム(たとえば.net 4.0)で構築されていて、PowerShell 2.0(.net 3.5に基づく)でロードしようとした場合、これが問題になる可能性があることがわかりました。これを回避するには、 .net4.0clrでPowerShellまたは呼び出しプロセスを必ずロードする必要があります。

必要に応じて、*。exe.config(まだ存在しない場合はpowershell.exe.configを作成)にサポートされているランタイムのエンティティを追加することで、これを行うことができます。

私はこれが上記の問題に対してうまく機能することをテストしました。

于 2012-05-09T07:03:06.767 に答える
1

これを解決してから少し経ちましたので、お詫び申し上げます。これに対する解決策は、少し奇妙ではありますが、実際にはかなり簡単であることがわかりました。

これを修正するために、ModuleName.psd1でコメントアウトしました。

ModuleToProcess = 'ModuleName.psm1'

そして、代わりにNestedModulesに追加しました。

NestedModules = Join-Path $psscriptroot 'ModuleName.psm1'

率直に言って、これによってモジュールが正常にロードされた理由は正確にはわかりませんが、うまくいきました。

これを解決してから少し経ちましたので、ここで見逃した小さなステップがある可能性があります。これでうまくいかない場合は、どのような問題が発生したかをお知らせください。それが私がしなければならなかった追加の問題であるかどうかをお知らせします。私はこれがすべてだったとかなり確信しています。

于 2012-05-24T17:43:43.333 に答える