【C#】PowerShellを管理者実行する方法

C#からPowerShellを管理者権限で実行する方法がわからなかったので書いてみました。

PowerShellからC#を実行する方法については色々と記事があるのですが、
その逆のC#からPowerShellを実行する方法についての記事はかなり少ない気がしています…

C#からPowerShellを管理者権限で実行する方法

実装方法

色々と試行錯誤した結果、下記の2パターンで実装できましたが、
今回は1をメインに説明します。

  1. C#側から管理者権限で実行するコマンドを発行
  2. PowerShellスクリプト側で条件に応じて管理者権限で実行する

手順

基本的にはRunspaceをオープンして、PowerShellコマンドを実行するだけです。
(PowerShellからPowerShellを開くような感じになっているのでなんか気持ち悪いですが…)

やっていることをざっくりと書くと下記の通りです。

  1. ポリシー権限を変更(RemoteSigned)
  2. 管理者権限でPowerShellスクリプト実行
  3. ポリシー権限を変更(Restricted)

ポリシー権限について特に弄る必要がない場合は2のみを実行する方法で問題ないです。

C#側ソース

サンプルソースについては下記の通りで、パラメータArgumentListに対して、
PSスクリプトのパスや引数を渡してあげれば実行できます。

実装するにあたって詰まった点

結構厄介だったのが下記の2店です。

  • パスにスペースが含まれている場合の対応
  • 最初に権限を変更してるにも関わらず、PSスクリプトを実行できない場合の対応

パスにスペースが含まれている場合の対応

これは基本的にコマンドプロンプトと同じくシングルクォーテーションまたはダブルクォテーションで囲めば良いのですが、
それだけでは駄目で先頭に「&」を付ける必要があります。

パラメータArgumentListへセットする場合には、その文字列に対して更にダブルクォテーションで括る必要があります。

最初に権限を変更してるにも関わらず、PSスクリプトを実行できない場合の対応

PSスクリプトを実行するのに、ポリシー権限を変更する必要があるのですが、
PSスクリプト実行前にポリシー権限を変更して実行したら、権限関連のエラーが発生してしまいました。
これはまだ良くわかっていないのですが、パラメータWaitを追加することで解決しました。
※詳しいことを知っている方がいらっしゃったらご教授ください…

PSスクリプト側 ソース

サービスを操作するPSスクリプトを書いてみました。
C#側から管理者権限ではなく一般ユーザ権限でPowerShellを実行した場合や
PSスクリプトを直接一般ユーザ権限で実行された場合を考慮して、
権限チェック処理と管理者権限での実行処理を実装しています。
(PowerShell歴:数日のド素人なので、雑なコードです)

色々と疲れた…_(:3」∠)_

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です