昔 Windows NT4.0向けに開発したシステムを、Windows7向けに調整する作業を行ったときの備忘録です。
Windows NT4.0のときに、ちゃんとしたインストーラを用意していなかったため自作DLL/OCXを、BATファイルでまとめてレジストリ登録する『なんちゃってインストーラ』を使っていました。これをそのまま利用したかったのですが、Windows7(Vista以降) では権限周りが厳格化されたた影響で、そのままでは使い物になりませんでした。
例えば
regsvr32 ?????
を、Windows7 で実行すると、
「 モジュール "?????" は読み込まれましたが、DllRegisterServer への呼び出しはエラーコード 0x80040200 により失敗しました。 」
等というメッセージが表示され登録することができません。
(私の場合は 0x80040201 でした。)
これはユーザーにレジストリを直接編集する権限が無いために発生するエラーです。
[参考サイト - Microsoft社のコミュニティサイト]
http://answers.microsoft.com/en-us/windows/forum/windows_7-windows_programs/error-codes-while-installing-program-0x80040200/97db71e4-929d-4eac-b950-25c5fd6e3d49
この問題を解決するために runas コマンドを利用しました。runas は一時的に他のユーザーでプログラムを実行するためのコマンドで、sudo に近いものと解釈して良いと思います。
ここでは管理者として regsvr32 を実行させたい訳なので、次のように修正して実行しました。
runas /user:administrator "regsvr32 ?????"
ダメでした。実行するとパスワードを訪ねられるのですが、設定した覚えが無かったのでそのまま enter すると、
「 1327: ログオン失敗: ユーザーアカウントの制限。考えられる理由として、空のパスワードが許可されていない、ログオン時間制限、またはポリシーによる制限が適用された、などが挙げられます。 」
のメッセージが表示されました。Administrator のパスワードが空だとダメのようです。
Administratorのパスワード設定はこのあたりを参考にしました↓
http://apple-voice.com/wordpress/2010/04/windows-7-how-to-enable-administrator/
Administrator のパスワードを設定した後に改めて実行すると、
「 193: ????? は有効な Win32 アプリケーションではありません。 」
のメッセージが表示されました。そんなバカなっ!
で、いろいろ試行錯誤した結果、runas を実行するとカレントディレクトリが他のディレクトリに移ってしまうことが原因でした。(少し前にやったのでうろ覚えですがシステムディレクトリあたりだったと思います。)
結局、BAT ファイルの先頭で
set mypath=%cd%
としておき、登録するコードを
runas /user:administrator "regsvr32 %mypath%¥?????"
とすることで無事に登録できるようになりました。これは、DLL/OCXと BATファイルが同じディレクトリにあることが前提ですね。
ちなみに regsvr32 を実行するたびに Administrator のパスワードを聞かれるので、ちょっと微妙ですね。
(これはインターネットに接続しないスタンドアロンのシステムで実施した措置です。)