おはようございます。こんにちは。こんばんは。
ミッド(@mid_v_lab)です
PowerShellってWindowsOSを使ってる環境なら、結構便利なんですよ~。
今から7年前?8年前?先輩から業務を教わってるときに、先輩が使ってたのがPowerShell。そこから独学をして、それなりの処理はスクリプトとして書けるようになりました。
Windowsに標準搭載されているので、サーバOSでも使えるし、batファイルよりも細かな制御ができます。
とはいえ、マルウェアなどで悪用されることもあり、デフォルト設定ではPowerShellのスクリプトを実行することができないので、なかなかに取り回しがしづらい。
そこで、端末側の実行ポリシーを「変更せず」にPowerShellを動かす方法を検討したときに考えたことをご紹介します。
- batでキックする
- exe化する
- タスクスケジューラに仕込む
ではいってみましょう!
batでキックする
PowerShellを起動するときに、batでキックするのが一番目の方法です。
脱batでPowerShellでスクリプトを作っているのに、PowerShellをbatで起動するという謎のねじれの位置関係。
方法として、batファイルに下記のように記載します。
powershell -ExecutionPolicy RemoteSigned .\test.ps1
batファイルとPowerShellのスクリプト(上記では、test.ps1)を格納しておき、「.\」で自分と同じディレクトリにあるPowerShellスクリプトを指定しています。
「ExecutionPolicy」がPowerShellの実行ポリシーを指定する部分で、ポリシーは「RemoteSigned」にしています。(なんとなくいつもRemoteSignedです)
こう記載すると、「test.ps1」を「RemoteSigned」のポリシーで実行してねと命令しているわけですね。
PowerShellの実行ポリシーをユーザ一人一人に変更させるのも手間ですし、セキュリティ的な面からも、batとPowerShellをセットにして提供するのが、一番オススメです。
exe化する
PowerShellをexe化するのが、二番目の方法です。
PowerShellじゃないじゃん!と思われるかもしれませんが、実行ポリシーを変更せずに使うためには手段は選んでいられません。
PowerShellスクリプトで実行したいことが、exeで実行できるならそれでモーマンタイ。
PS2EXE-GUIなどのツールで、.ps1→.exeにすることが可能です。
ただし、PowerShell独自に細かい処理はexe化するとできないようで、exe化したときにきちんと動くかどうかはチェックが必要です。(ps1の時の挙動をしてくれない場合がある)
exeすると良いこととして、スクリプトの中身を難読化することが可能なので、ユーザにスクリプトの中身を見られたくない時に重宝します。
例えばライセンスキーやパスワードといった情報をスクリプト内に埋め込まざるを得ないときですね。
無事exe化できれば、ファイルサーバに置くなり、イントラサイトに置くなりして、ユーザへ配布すればOKです。
タスクスケジューラに仕込む
PowerShellを起動するときに、タスクスケジューラでキックするのが三番目の方法です。
1番目のbatでキックすると似ていますが、こちらは配布ソフトなどが入っているのが前提になると思います。ユーザに気づかれないように実行したい、夜間帯にそっと実行したい、などの場合に便利な時があります。
ドメインコントローラで仕込むのもありですね。
タスクスケジューラの設定は下記のような感じ。
・プログラム
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
・引数の追加
-ExecutionPolicy RemoteSigned C:\tool\test.ps1
・開始
C:\tool
「プログラム」にはPowerShell.exeまでにフルパスを入れ、「引数の追加」に実行ポリシーの指定とスクリプトのフルパス、「開始」にスクリプトの格納されているディレクトリを入力します。
タスクスケジューラへの仕込みもbatなどでもできたと思いますが、配布ソフトがないと結構厳しいですね。
MS正規ツールのMsexecなどをうまく使えれば、配布ソフトなくてもできると思いますが・・・ちょっと触ったことありますが、あれはあれで難しい。
PowerShellスクリプトを実行ポリシーを変更せずに実行する手法3つをご紹介しました。
1と2は実際に動かした経験があります。3はサーバなどにスクリプトを仕込むのに登録自体はしていますが、実行ポリシーの指定はしてないですね。
PowerShellじゃなくVBS使う、bat使うなど手法は色々ありますが、一番大事なのは「実現したい処理を実施すること」ですので、その時その時にあった方法を模索しましょう。
ではでは