batファイルからKickするPowerShellのExecutionPolicy Errorについて

Facebook にシェア
Pocket

日々Windowsを利用して業務をしている人、特にWindowsServerやら流行りのRTAの業務をしている人にとってPowerShellは結構使う頻度が高いものです。ある程度慣れてくるとネット上のコピペから自作へ移行し、自作スクリプトを走らせて業務の効率化を計ることも多いかと思います。
そういった中で割と引っかかりがちなのがセキュリティ機構による保護での実行失敗だったりするので最近引っかかったネタを置いておきます。

私はしがないOffice365管理者なのであまり開発系は強くないんですが同部署の先輩がRTAを利用したツール開発業務をしていて、私にHELPが飛んできたんですね。
曰く「Set-ExecutionPolicyしたのにPolicy違反でPowershellスクリプトを実行できない」とのことでした。

ある程度PowerShellを触ったことがある方なら知っているかとは思うのですが、PowerShellで.ps1等のファイルを扱う際にはいくつかの実行モードがありまして、詳細についてはMicrosoftの公式文書に記載があります。
大体ほとんどの場合ではExecutionPolicy=Restrictedになっているため自作のPowerShellスクリプトはそこいらの胡散臭い野良アプリと判断されて実行できないため、管理者権限で ‘ Set-ExecutionPolicy RemoteSigned ‘ とかして手元で作ったps1ファイルの実行を許可するわけですね。

ところが今回先輩から受けた件で早速‘ Get-ExecutionPolicy ‘ したところRemoteSignedどころかUnrestrictedとなっており、ps1ファイルはどんな胡散臭いものでも実行できる状態でした。
ところが、ps1ファイルを直に指定すると実行できるのにRTAツールから起動するとExecutionPolicy違反で実行ができない。これを受けて私も以下の通りいろいろ試してみたんですがどうにも治りませんでした。

  • ExecutionPolicyを一度Restrictedにしてから再度Unrestrictedに再設定
  • RTAツールを管理者権限で実行してKick
  • PowerShellのプロパティで「常に管理者権限で実行」

結局上記手段では治らなかったわけなんですが、RTAツールからPowerShellをKickするにあたってのフローを聞いてようやく原因に思い当たりました。
そのRTAツールはVBScriptをサポートしていて、ツール内であらかじめ記載しておいたVBScriptを実行することができるわけです。

先輩はRTAツール→VBScript→batファイル→ps1というフローで最終的にPowerShellスクリプトを実行しようとしていました。
ここでキモになるのがbatファイルです。

登場からかなりの年月が過ぎましたが今でもWindowsの管理・自動化において広く利用されているbatファイル、こいつを実行するとcmd.exeが起動して記載内容を実行します。
現在稼働しているWindowsOSの大半は64BitOSだと思いますが、cmd.exeはx86版とx64版が用意されており、PowerShellもまたx86版とx64版が用意されています。
ここで問題になるのが、x86版とx64版のPowerShellではExecutionPolicyが独立して設定されているということです。

 

ExecutionPolicyが独立したx64/x86版PowerShell

つまり、x86版のcmdからはx86版のPowerShellが呼ばれ、x64版のcmdからはx64版のPowerShellが呼ばれ、それぞれでExecutionPolicyが独立していることにより設定したはずのExecutionPolicyがツール経由だとPolicy違反で起動しないという事態に陥るわけです。
不幸にも先輩の環境ではGet-ExecutionPolicyを実行してUnrestrictedを確認した環境はx64版で、VBScriptから呼ばれるbatファイルを実行するのはx86版のcmdでした。

先輩の環境においてはx86版のPowerShell側でも‘ Set-ExecutionPolicy Unrestricted ‘ を実行し、RTAツールからのPowerShellスクリプトを実行可能になりました。
まぁ実際こんなことはすでに先達がいるわけなんですがこの解決に30分ほど費やしてしまいましたので供養として記事にしておきます。

Facebook にシェア
Pocket