知識マップ: C#(CSharp)でPowerShellを実行して、オブジェクトとして受け取る方法
記事「C#(CSharp)でPowerShellを実行して、オブジェクトとして受け取る方法」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。
C#からPowerShellを呼ぶ場合、外部プロセスを起動し標準出力を文字列で読む方法は表示形式に依存し壊れやすいのに対し、PowerShell SDKを使うと結果をPSObjectのコレクションとして受け取れ、BaseObjectで元の.NETオブジェクトを、Propertiesで列名を指定した値を取り出せる。C#に渡すならFormat-Tableではなく、Select-Objectや[pscustomobject]で列を整えるべきで、ユーザー入力はAddScriptへ文字列連結せずAddCommand/AddParameterでパラメーター値として渡しコード注入を避ける。画面アプリではInvokeAsyncで非同期実行しつつ、CancellationTokenの登録はパイプライン起動より後に行わないと停止要求が空振りする。実行中の同一インスタンスへの再Invokeは例外になるため、並行実行にはRunspacePoolを使う。
flowchart LR
accTitle: C#からPowerShellをPSObjectとして実行する知識マップ
accDescr: PowerShell SDKを使うとPowerShellの実行結果を文字列ではなくPSObjectとして受け取れること、BaseObjectとPropertiesの使い分け、AddParameterによるコード注入の回避、Select-ObjectとFormat-Tableの使い分け、InvokeAsyncでのキャンセルとRunspacePoolによる並行実行の要点を示す図
powershell_sdk["PowerShell SDK(System.Management.Automation.PowerShell)"]
psobject["PSObject"]
addcommand_addparameter["AddCommand/AddParameter"]
addscript["AddScript"]
csharp_side_result_processing["C#側で結果を加工する処理"]
psobject_baseobject["PSObject.BaseObject"]
psobject_properties["PSObject.Properties"]
format_table["Format-Table/Format-List"]
select_object["Select-Object"]
pscustomobject["[pscustomobject]"]
user_input_to_powershell["PowerShellへユーザー入力を渡す要件"]
script_injection_risk["スクリプト注入リスク"]
invokeasync["PowerShell.InvokeAsync"]
windows_powershell_5_1["Windows PowerShell 5.1"]
begininvoke_endinvoke["BeginInvoke/EndInvoke"]
dotnet_framework[".NET Framework"]
pipeline_stop_api["パイプライン停止API(Stop/BeginStop/EndStop)"]
pipelinestoppedexception["PipelineStoppedException"]
runspacepool["RunspacePool"]
concurrent_powershell_execution["複数のPowerShell処理を並行実行したい要件"]
erroraction_stop["ErrorAction Stop"]
process_based_powershell_invocation["外部プロセスとしてのPowerShell起動"]
cancellable_pipeline_pattern["CancellationTokenでパイプラインを安全に止める実装パターン"]
cancellationtoken_dotnet["CancellationToken(.NET)"]
premature_cancellation_registration["パイプライン起動より前のキャンセル登録"]
cancellation_race_miss["登録と起動の間のキャンセル空振り"]
powershell_sdk -->|"利用する"| psobject
powershell_sdk -->|"利用する"| addcommand_addparameter
powershell_sdk -->|"利用する"| addscript
csharp_side_result_processing -->|"利用する"| psobject_baseobject
csharp_side_result_processing -->|"利用する"| psobject_properties
format_table -->|"用いるのは非推奨"| csharp_side_result_processing
select_object -->|"推奨される対応"| csharp_side_result_processing
pscustomobject -->|"推奨される対応"| csharp_side_result_processing
addcommand_addparameter -->|"推奨される対応"| user_input_to_powershell
addscript -.->|"原因になり得る"| script_injection_risk
addcommand_addparameter -->|"防止する"| script_injection_risk
powershell_sdk -->|"利用する"| invokeasync
windows_powershell_5_1 -->|"両立しない"| invokeasync
windows_powershell_5_1 -->|"利用する"| begininvoke_endinvoke
dotnet_framework -.->|"利用する"| windows_powershell_5_1
powershell_sdk -->|"利用する"| pipeline_stop_api
pipeline_stop_api -->|"原因になり得る"| pipelinestoppedexception
runspacepool -->|"推奨される対応"| concurrent_powershell_execution
powershell_sdk -.->|"用いるのは非推奨"| concurrent_powershell_execution
powershell_sdk -->|"で構成できる"| erroraction_stop
process_based_powershell_invocation -->|"用いるのは非推奨"| csharp_side_result_processing
powershell_sdk -->|"推奨される対応"| csharp_side_result_processing
cancellable_pipeline_pattern -->|"利用する"| pipeline_stop_api
cancellable_pipeline_pattern -->|"利用する"| cancellationtoken_dotnet
premature_cancellation_registration -->|"原因になり得る"| cancellation_race_miss
cancellable_pipeline_pattern -->|"防止する"| cancellation_race_miss
概念間の関係(全26件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- PowerShell SDK(System.Management.Automation.PowerShell)はPSObjectを利用します。
- PowerShell SDK(System.Management.Automation.PowerShell)はAddCommand/AddParameterを利用します。
- PowerShell SDK(System.Management.Automation.PowerShell)はAddScriptを利用します。
- C#側で結果を加工する処理はPSObject.BaseObjectを利用します。
- C#側で結果を加工する処理はPSObject.Propertiesを利用します。
- Format-Table/Format-ListをC#側で結果を加工する処理に用いることは推奨されません。
- Select-ObjectはC#側で結果を加工する処理に対する本記事の推奨です。
- [pscustomobject]はC#側で結果を加工する処理に対する本記事の推奨です。
- AddCommand/AddParameterはPowerShellへユーザー入力を渡す要件に対する本記事の推奨です。
- AddScriptはスクリプト注入リスクの原因になることがあります。
- AddCommand/AddParameterはスクリプト注入リスクを防ぎます。
- PowerShell SDK(System.Management.Automation.PowerShell)はPowerShell.InvokeAsyncを利用します。
- Windows PowerShell 5.1はPowerShell.InvokeAsyncと両立しません。
- Windows PowerShell 5.1はBeginInvoke/EndInvokeを利用します。
- .NET FrameworkはWindows PowerShell 5.1を利用します。
- PowerShell SDK(System.Management.Automation.PowerShell)はパイプライン停止API(Stop/BeginStop/EndStop)を利用します。
- パイプライン停止API(Stop/BeginStop/EndStop)はPipelineStoppedExceptionの原因になることがあります。
- RunspacePoolは複数のPowerShell処理を並行実行したい要件に対する本記事の推奨です。
- PowerShell SDK(System.Management.Automation.PowerShell)を複数のPowerShell処理を並行実行したい要件に用いることは推奨されません。
- PowerShell SDK(System.Management.Automation.PowerShell)はErrorAction Stopで構成できます。
- 外部プロセスとしてのPowerShell起動をC#側で結果を加工する処理に用いることは推奨されません。
- PowerShell SDK(System.Management.Automation.PowerShell)はC#側で結果を加工する処理に対する本記事の推奨です。
- CancellationTokenでパイプラインを安全に止める実装パターンはパイプライン停止API(Stop/BeginStop/EndStop)を利用します。
- CancellationTokenでパイプラインを安全に止める実装パターンはCancellationToken(.NET)を利用します。
- パイプライン起動より前のキャンセル登録は登録と起動の間のキャンセル空振りの原因になることがあります。
- CancellationTokenでパイプラインを安全に止める実装パターンは登録と起動の間のキャンセル空振りを防ぎます。
主要概念の定義
機械可読データ
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。