亀岡的プログラマ日記

京都のベッドタウン、亀岡よりだらだらとお送りいたします。

UACを乗り越えて外部PCにソフトウェアをインストールする

Windowsアプリ最大のハマりどころ、デプロイ

Windowsアプリ開発でも、なんとかしてCIを回せる環境は整っています。ビルドはもとより、自動テスト周りはVisual Studioのバージョンが上がるにともない、相当にやりやすくなっています。 スクリプト言語勢のメタプロ的強力さ、JVM勢の安定感も捨てがたいですが、.NET勢もいい線行っていると思います。*1

まぁ、それでもやっぱり、アプリ、特にWindowsアプリで最大の障害となるのはデプロイメントですよね。。。要するにインストールです。

なぜインストールを巡るあれこれ

実際問題、UAC切ってJenkinsさんをスレーブで放り込んでしまえば、まぁデプロイメントできるんです。できるんです、が。

本質問題として、UAC切ることは非常にテスト環境として怖いのですよ。例えばスモークテストやるにしても、「UACだから立ち上がらない」っていうのを検出はして欲しい!!未だに機能テストでUAC起因のエグいバグを見つけるのは多いのですよ。

つまり、大要求としては

  • UACを切らずに自動インストールさせてよ!!

と、なるのです。さてさて。どうしましょうかねぇ。。。

PSExec + レジストリ操作で、いける??

警告

ひとまず、現状の僕が見出しているやり方は、以下の様な感じです。プロダクションというか、実環境で業務運用した実績はないのでそこは用法用量を守ってお使い下さい。じゃない。ご自身の責任でお使い下さい。

さてさて、ではどうするか。リモートコンピュータ上でファイルを実行するものとしては、存外いろいろあったりします。最近ではやはり、Powershell貴公子であるところの@guitarrapc先生のValentiaは、抑えておきたいツールです。しかし、今回のUAC乗り越え用途には残念ながら適しているとはいえませぬ(そもそもサーバーデプロイ用のツールですしね)。

それでは何を?となると管理者用ツールに出張ってきていただきましょう。Windows SysinternalからPsExecです。詳しい解説は以下をお読み下さいませ。

WINDOWS SYSINTERNALS 徹底解説 (Microsoft Press)

WINDOWS SYSINTERNALS 徹底解説 (Microsoft Press)

しかしこれ、UAC環境化でうまく動かず、上記記事でもUAC切ろうぜ、という話になってしまっています。そうじゃない!そうじゃないんだ!!

と悶絶していると、いや意外と情報はあるもんなんですよね。UACではないレジストリ値をいじればいいという意見がチラホラあるのですよ。

方法は・・・

リモートコンピュータがWindows Vista以降のOSの場合、レジストリに新しいキーを設定する必要があります。 レジストリエディタで、HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion?\Policies\Systemに、 DWORD 値を新規作成し、名前をLocalAccountTokenFilterPolicyとし、値を「1」とします。

ということで、レジストリ値を追加します。 これは何かというと、Vista以降の仕様変更で、組み込みAdminユーザ以外のリモート接続を許さない、という動きになったらしいのですが、その動きを切ってしまうものみたいです。

まぁ、外部公開にしちゃうとおいおいおいおい、となりますがイントラでのテスト環境なら是でしょう。

PSExecによる擬似suでできるようになるもの

さて、これができると相当大きいですよ。PSExecには限定権限でコマンドを実行するオプション-lもありますので、外側からUACのオン・オフを擬似的に切り替えつつ任意のコマンドを実行できるようになります。つまり。

  • システムを管理者権限でインストールして、通常権限でスモークテストを実行する
  • 自動で仮想マシンをセットアップして、管理者権限必要な権限のみPSExecでさわってやる

といったことが割と手軽にできる!かもしれません。

とりあえず、前者を色々試してみますよっと。

*1:でも僕はGroovyが一番いいではないかと割と本気で思っています