読者です 読者をやめる 読者になる 読者になる

詩と創作・思索のひろば

ドキドキギュンギュンダイアリーです!!!

PowerShell を使って .exe ファイルを Windows サービスとして登録する

Windows PowerShell

Windows にはサービスという概念があって、UNIX でいうデーモン的なことはこれを使えば実現できる(MSDNWikipedia)。サービスにはその停止や再起動などの要求に答える責任があるので、それらに対応していないアプリケーションをそのままサービスとして登録することはできないのだけど、任意のアプリケーションのラッパーとなるサービスアプリケーションが Microsoft によって提供されているので、これを使えば実現できる。

前準備

サービスとして登録する PowerShell スクリプト

汎用化はできてなくて、決め打ち。

install-mackerel-agent-service.ps1

これを実行する(PowerShell コンソールを起動して、\Path\To\Script.ps1)と、管理者権限を求める UAC ダイアログが表示されたあと、管理者権限のコンソールが開き、自動で MackerelAgentService というサービスがインストールされる(起動はしない)。表示されたままのコンソールは閉じてもいいし、

sc.exe start MackerelAgentService

でサービスを起動することもできる。

ちなみにサービスの削除は sc.exe delete で可能。

f:id:motemen:20150111145459p:plain

Mackerel への PC の登録、メトリックの投稿ができました。

解説

  • PowerShell の New-Service コマンドレットを使って MackerelAgentService という名前で srvany.exe を登録する。
  • その後レジストリを操作して srvany.exe に渡すパラメータを登録する。このパラメータが、サービス化したいコマンドになってればいいらしい。
    • New-Item と Set-ItemProperty でレジストリを操作できる。これはファイルシステムに対しても同じように使える汎用的なコマンドレット。
  • Start-Process コマンドレットに -Verb RunAs を指定すると、指定したコマンドを管理者権限で実行できる。
  • powershell.exe は -Command "& {<command>}" を指定することで
  • { … } はスクリプトブロックと呼ばれる構文らしい。たぶん文字列化して渡してる気がするんだけど、この辺の正確な理解ができていない……。

参考

ちなみに NSSM - the Non-Sucking Service Manager ってのもあるらしい。