質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

3175閲覧

WPFアプリからPowerShellにコマンドを送りたい!

fruit88

総合スコア5

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2019/09/06 17:53

前提・実現したいこと

LAN内の複数台のWindowsサーバにWinRMで(不定期に複数回)アクセスしたいと考えています.
操作の簡略化 & 自身のプログラミングの勉強のため,GUIでの操作を検討しました.
操作に応じて,複数のPowerShellインスタンスでサーバにコマンドを送信し,結果を見る,という感じです.
そこで,C#でWPFからPowerShellにコマンドし,結果を受け取って整形することを目指しました.

最初に動作確認として,コンソールアプリのプロジェクトで,
PowerShellインスタンスを作成→AddCommand→Invoke
をしようとしたのですが,.Create()という最初の段階で躓いてしまいました.

※CやPythonの経験はありますが,Visual Studio + C#で何か作るのは今回が初です.

発生している問題・エラーメッセージ

単純なコードでも,PowerShellインスタンスを作成しようとすると? 例外が起こってしまいます.

var powershell = PowerShell.Create();
とすると,下記が出ます.

System.InvalidProgramException: 'Common Language Runtime detected an invalid program.'

PowerShellのバージョン,動作bit,System.Management.Automationの場所(Reference Assembliesのパッケージ)が関係していそうだと思い,
C# PowerShell Windows10 のワードで出てくるようなサイトを巡ったのですが,
どこも意外に動いているようで,結局自分にはバージョンの組み合わせもわからず,といった状況です.

該当のソースコード

C#

1using System; 2using System.Text; 3using System.Management.Automation; 4using System.Management.Automation.Runspaces; 5using System.Security; 6using System.Collections.ObjectModel; 7using System.Diagnostics; 8using System.Collections; 9 10namespace ConsoleApp1test 11{ 12 class Program 13 { 14 static void Main() 15 { 16 try 17 { 18 using (var powershell = PowerShell.Create()) 19 { 20 powershell.AddCommand("Get-ChiledItem"); 21 powershell.AddCommand("Out-String"); 22 23 foreach (var result in powershell.Invoke()) 24 { 25 Console.WriteLine(result); 26 } 27 } 28 Console.WriteLine(" ktkr "); 29 30 } 31 32 catch 33 { 34 Console.WriteLine("ダメです!"); 35 } 36 37 38 } 39 } 40 41 42}

試したこと

  • プロジェクトのプロパティの対象プラットフォームを変更

x64, x86, Any CPUで32ビットを選ぶ,32ビットのチェックを外す

  • 最適化コードのチェック ON/OFF
  • オプションのデバッグから,マイコードのみのチェックを ON/OFF
  • System.Management.Automationの参照の仕方を変更

 1. "C:\Program Files (x86)\Reference Assemblies\Microsoft\WindowsPowerShell\3.0\System.Management.Automation.dll"を指定
2. ソリューションのNuGetパッケージ管理から,Microsoft.PowerShell.5.ReferenceAssembliesのv1.1.0をダウンロード(".netcoreapp 2.1 ~ではなく .NET v4.6を使用して復元されました.~" の警告が出ました)
3. 同様のパッケージ管理から,2.のを消して5.1をダウンロード.同様の警告が出ました

NU1701 パッケージ 'Microsoft.PowerShell.5.ReferenceAssemblies 1.1.0' はプロジェクトのターゲット フレームワーク '.NETCoreApp,Version=v2.1' ではなく '.NETFramework,Version=v4.6.1' を使用して復元されました。このパッケージは、使用しているプロジェクトとの完全な互換性がない可能性があります。

補足情報(FW/ツールのバージョンなど)

OS:Windows 10 Pro 1809
IDE:Visual Studio Community 2019 Version 16.2.3
.NET Framework Version 4.7.03190
PowerShell: 5.1.17763.316 (Get-Host)
※PSの別バージョンを故意にインストールしようとことはありません.

最終的に,冒頭で述べた動作ができれば良いので,WinRM on GUIな良い方法があれば,そちらでもご教授いただければ有り難いです.
よろしくお願いします.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2019/09/07 00:31 編集

削除
guest

回答1

0

ベストアンサー

System.Management.*** の参照をすべて外し、NuGet で Microsoft.PowerShell.5.ReferenceAssemblies をインストールしてください。

powershell.AddCommand("Get-ChiledItem");

これを次のように変えください。

PowerShell

1powershell.AddCommand("Get-ChildItem");

以上でうちでは動きました。

投稿2019/09/07 00:34

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fruit88

2019/09/07 03:48

回答ありがとうございます. しかし,変化はありませんでした. Childのスペルミスを直し, 一度全て参照を外し,依存関係もSDK以外削除して,ソリューションをクリーンして, NuGet で Microsoft.PowerShell.5.ReferenceAssemblies をインストールしました. (勝手に参照が追加されるのかと思いましたが,されなかったので,インストール後また書きました.) System.Management.Automation のみ参照したり,5.1を入れてみたりしましたが同じでした.
Zuishin

2019/09/07 03:50

参照は自動的に追加されるはずです。NuGet はどのように使いましたか?
fruit88

2019/09/07 05:32 編集

プロジェクト(コンソールアプリ)"ConsoleApp1test" 作成 → ソリューションエクスプローラー上のConsoleApp1test 上で右クリック → NuGetパッケージの管理 → 左画面参照タブから「PowerShell.5.Reference」で検索 → 1番上に出てきた Microsoft.PowerShell.5.ReferenceAssemblies をマウスオーバー → v1.1.0 右の下矢印をクリックし,同意等押してインストール です. このとき,エラー一覧ウィンドウに,質問投稿時に記載したNU1701のエラーが出ています. また,Program.cs上にusing System.Management.*等は一切追加されませんでした.
Zuishin

2019/09/07 05:32

普通にスタートメニューから PowerShell を起動することはできますか?
fruit88

2019/09/07 05:35

PowerShellもPowerShell ISEも問題なく起動します. Get-Hostコマンドによるバージョンの確認も,スタートメニューから起動したPowerShellでGet-Hostコマンドをしました. Windowsは普段管理者アカウントで使用しています.
Zuishin

2019/09/07 05:49 編集

System.InvalidProgramException は壊れた実行ファイルや別の OS 用の実行ファイルやそもそも実行ファイルでないものを実行しようとしたときにスローされる例外のようです。 推測ですが、System.Management.Automation.dll の間違ったバージョンがインストールされ、そちらが有効になっているのではないかと思います。 NuGet でのパッケージインストール時にも PowerShell が使われるので、そこで同じエラーが出るということは、その可能性は低くないと思っています。 この推測が当たっている場合、修正法としては、正しくないものをアンインストールして正しい物で上書きする、またはレジストリを書き換えるということになりますが、レジストリの書き換えには詳しい調査が必要で、間違えると OS 自体に不具合が生じる可能性もあります。 PowerShell 5.x(と、その SDK があればそれも)をダウンロードし、怪しい物をアンインストールしてからそれをインストールしてみてください。 それでできなければ OS の再インストールが最も現実的なものになるかと。
fruit88

2019/09/07 10:46

一つずつ潰すのが最適かと思いますが,時間もかかりそうでしたので, Visual Studioのアンインストール(Visual Studio Installer から)後, OSの更新 1809→1903 (※Powershellは5.1.18362.145になっていた) を行い,NuGet パッケージの管理 から "Microsoft.PowerShell.SDK (6.2.2)" をインストールしたところ, NU1701もなく,実行するとディレクトリ内のアイテムが表示されました. しかしProgram.csへの参照の追加は自動ではありませんでした. 手動で using System.Mangement.Automation; を入力しました. なお,入れたのはそれだけで,結局 Microsoft.PowerShell.5.ReferenceAssemblies は無しです. 別の sln で SDKではなく,これまで通りReference Assembliesの方のみインストールしても同じエラーで再インストール前から変化はありませんでした. 依存関係の Microsoft.PowerShell.SDK (6.2.2) の一覧内に,System.Management.Automation.dll の記述がありました. PowerShell のバージョンとの対応がわからないので不安ですが,ひとまずPowershellインスタンスを作成できたというところは解決致しました. 読み込んでいるdllの問題かも,SDKを入れる(入れ直す)等の意見が大変参考になりました. ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問