【Unity】Windowsのサービスの状態取得やコントロールを行う

UnityからWindowsのサービスの状態を取得したり,起動,停止を行う方法が,ちょっとつまづいたのでメモ.そもそもUnityからサービスの取得を行ったりするのは需要が無いのだと思うのだが…
他に良い方法があれば誰か教えて下さい…

とりあえず完成品サンプルはここにあります.
https://github.com/nmxi/Unity_WinServiceController

Env.

Windows10 64bit
Unity2019.3.3f1

Method

今回実装した方法はコンソールアプリケーションをUnityから引数付きで呼ぶ方法.
本当はC++でWindowsのNativePluginを作成すればキレイかつ,取り回しが楽なのだと思うが,体力が今はなかった.悪しからず…(GitHubに既にある予感もする)

コンソールアプリケーションを作成した

上記のソースを要約するとSystem.ServiceProcess.ServiceControllerを使って,サービスの取得と起動,停止を行うプログラム.

第1引数で取得なのか開始なのか停止なのかを選択し,第2引数でサービス名を与えてあげるとサービスのコントロールを行えるというものになっている.

System.ServiceProcess.ServiceController クラスがUnityのMonoBehaviour上で直接使えれば万事解決なのだが,残念ながら使えない..NETの開発者ツールの中に入っている,なんとかDLLを追加する方法もあったが,DLLが再配布禁止っぽかったので割愛.

System.ServiceProcess.ServiceController 自体はnugetパッケージでも提供されていて,ライセンスはMITなので嬉しい.

コンソールアプリケーション のビルド

ビルドして以下のような感じ.
今回このコンソールアプリケーションはWinServiceControllerと名付けた.

これであとはUnityのスクリプトから引数付きで呼んであげればOK.

UnityからWinServiceControllerを呼ぶ

コンソールアプリケーションをUnityのAssets/StreamingAssetsフォルダにいれる.
以下のスクリプトのControlServiceNameにあれこれしたいサービス名を入れて,

GetStatus()
StartService()
StopService()

を呼び出せばあれこれできる.

System.Diagnosticsクラスを使ってcmdでコマンドをたたくのと同じことを行っている.

サービスの開始と停止は管理者権限でないとできないので注意.
上記ソースの

を入れると管理者として実行するかダイアログがでて聞かれるようになる.
管理者権限が得られなかったときなどのエラーをCatchするようにソースを書いてないので,もう少し改良が必要なところ.

GitHub

https://github.com/nmxi/Unity_WinServiceController

ここにサンプルのプロジェクトを置きました.
ライセンスはMIT.
Unityのプロジェクトファイルとコンソールアプリケーションのソースが両方入ってます.

サンプルではInputFieldにあれこれしたいサービス名を入力してボタンを押すことで動作するようになっている.

Ref.

System.ServiceProcess.ServiceController nugetパッケージhttps://www.nuget.org/packages/System.ServiceProcess.ServiceController/

コメントする

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