ローカル環境:windows 10
リモート環境:Centos 7
この記事はpowershellを非表示でバックグラウンド実行させっぱなしにする方法です。
#何ができるか
.ps1スクリプトを走らせっぱなしにしておくと、最小化してもタスクバーに残るので邪魔です。PC起動時に画面を開かずserviceとしてpowershell実行します。
筆者はsshポートフォワーディングをこれで行うことで、リモート環境のjupyterを開いたりします。なお、画面を開かないのでこれで起動したpowershellに対話的な入力はできません。
#やり方
.ps1をpowershellの引数と与えサービスとして登録します。
(sshポートフォワーディングを例にしていますが、ほかのことにも使えそうです)
■GUIのあるソフトウェアをサービス化する
・https://nssm.cc/download からLatest release 2014年のもの(古くても大丈夫)をダウンロード。
・解凍してnssm-2.24\nssm-2.24\win64\nssm.exe を
・環境変数Pathに設定されているフォルダに入れる
・管理者でpowershell起動 (以下、説明画像あり)
・「nssm install 任意のサービス名」と叩く。
・「任意のサービス名」はこの後使うので覚えておく。
・立ち上がったUIで
「Path」:Powershellの.exeファイル
「Startup directory」:任意の作業ディレクトリ
「Arguments」:任意の.ps1ファイル
「install service」を押す(説明画像ここまで)

■サービスを実行するアカウントに対し「サービスとしてログイン」を許可する。
※理由はポートフォワーディングがLocal Systemの権限ではできないため。ユーザーアカウントでサービスを動かす。
・グループポリシーエディタを開くWin+R「gpedit.msc」
※グループポリシーエディタがない場合
(https://itojisan.xyz/trouble/17155/ で配っている「gpedit.bat」でグループポリシーエディタをインストールできる。
・グループポリシーエディタで以下を編集(以下、説明画像あり)
コンピューターの構成 > Windows 設定 > セキュリティ 設定 > Local Policies > User Rights Assignment
サービスとしてログオン のプロパティ
「ユーザーまたはグループの追加」:ボタンを押す
「選択するオブジェクト名を入れてください」:アカウント名を入力
「名前の解決」:ボタンを押す
「OK」「OK」、全てのウィンドウを閉じる。
・これで「サービスとしてログイン」の許可は完了。(説明画像ここまで)

■サービスを実行するアカウントを設定する
・「サービス」を開く(以下、説明画像あり)
・登録した「任意のサービス名」のプロパティを開く
・ログオン(タブ) > アカウント > 参照
「選択するオブジェクト名を入れてください」:アカウント名を入力
「名前の解決」:ボタンを押す
「OK」
「パスワード」:ログインに使っているもの入力
「パスワードの確認入力」: 〃
「OK」(説明画像ここまで)
・登録した「任意のサービス名」を右クリック > 「開始」
・.ps1が実行されている状態となる。
■powershellでps1を呼び出せるにしておく
サービス内部の処理で、サービスが停止してしまう場合は、
管理者権限のpowershellで
Set-ExecutionPolicy RemoteSigned
と叩いてps1の実行許可を恒久的に与えておく。
##.ps1のサービス化の作業はここまでで完了しています。あとは関連情報です。
■sshポートフォワーディングの確認方法
・powershellを開き
「Test-NetConnection -ComputerName localhost -Port 8888」と叩くと
成功:True 失敗: failed でポートフォワーディングできているか確認できる。
■個人的な味付けをする。
・サービスの再起動設定
「サービス」を開く
登録した「任意のサービス名」のプロパティを開く
・回復(タブ) でエラー時の挙動を設定できる
この記事は以上です。
