x64版Windowsで32ビットアプリケーションから64ビットアプリケーションを呼び出すには%Systmroot%\Sysnativeを指定する
x64なWindowsで、32ビットアプリケーションであるJP1/AJS2からバッチファイルを実行する場合、wbadmin.exeコマンドのパスに注意しなければならないって事です。
×C:\Windows\System32\wbadmin.exe
○C:\Windows\Sysnative\wbadmin.exe
先日こんな事がありました。
Windows Server 2008 R2で、OS標準のWindows Serverバックアップのwbadminコマンドを使って、バックアップを実行するバッチファイルを作成しました。
エクスプローラーからバッチファイルをダブルクリックしてもOK、タスクスケジューラーから自動実行させても問題なし。
しかしお客さんがそのバッチファイルをJP1/AJS2からスケジュール実行すると、wbadmin.exeコマンドを呼び出すところで以下のメッセージでエラーとなるそうです。
'C:\Windows\System32\wbadmin.exe' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
バッチファイル上ではwbadmin.exeコマンドはフルパスで呼び出しています。
タスクスケジューラーから実行しても正常に動作するのだから間違っていないはず。
cmd /c C:\Windows\System32\wbadmin.exe
お客さんからJP1のサポートに問い合わせてもらったのですが、原因がわかりました。
JP1/AJS2は32ビットアプリケーションだから、64ビットアプリケーションであるwbadmin.exeを呼び出すには「C:\Windows\System32」ではなく、「C:\Windows\Sysnative」を指定しなければならないそうです。
実際にその通りに修正すれば正常に動作しました。
この話を聞いたときは、しばらく意味が理解できずちょっと悩んだんですが、少し調べるとわかってきました。
自分で理解するために、少し検証してみました。
(写真1)64ビットcmd.exeと32ビットcmd.exeの場所

x64のWindowsではコマンドプロンプトも当然64ビットです。
今回の検証は32ビット版のコマンドプロンプトが必要なんですが有りました。
64ビット版 C:\Windows\System32\cmd.exe
32ビット版 C:\Windows\SysWOW64\cmd.exe
(写真2)64ビットと32ビットのコマンドプロンプトを起動した状態のタスクマネージャー

2つのcmd.exeを起動してタスクマネージャーで見てみました。
それぞれの実行パスと32ビット、64ビットが確認できます。
(写真3)64ビットコマンドプロンプトからwbadmin.exeを呼び出す

64ビット版のC:\Windows\System32\cmd.exeからwbadmin.exeを呼び出します。
%systemroot%\System32\wbadmin.exe /?
普通に呼び出すことができます。問題なし。
(写真4)32ビットコマンドプロンプトからwbadmin.exeを呼び出す

32ビット版のC:\Windows\SysWOW64\cmd.exeからwbadmin.exeを呼び出します。
%systemroot%\System32\wbadmin.exe /?
確かにwbadmin.exeが見つからないとなります。
(写真5)64ビットコマンドプロンプトから各パスを確認

%systemroot%\system32は、そのフォルダを見ています。
%systemroot%\SysWOW64も、そのフォルダを見ています。
%systemroot%\Sysnativeは、そのフォルダが存在しません。
(写真6)32ビットコマンドプロンプトから各パスを確認

%systemroot%\system32は、%systemroot%\SysWOW64にリダイレクトされています。
%systemroot%\SysWOW64は、そのフォルダを見ています。
%systemroot%\Sysnativeは、%systemroot%\system32にリダイレクトされます。
(写真7)%systemroot%\system32と%systemroot%\SysWOW64のwbadmin.exeを確認

%systemroot%\system32\wbadmin.exeは存在します。
%systemroot%\SysWOW64\wbadmin.exeは存在しません。
わかってしまえばそうなんですが、なかなか面倒ですね。
まとめると
64ビットアプリケーションからは
%systemroot%\system32は、そのフォルダを参照する
%systemroot%\SysWOW64も、そのフォルダを参照する
%systemroot%\Sysnativeは、そのフォルダは存在しない
32ビットアプリケーションからは
%systemroot%\system32は、%systemroot%\SysWOW64にリダイレクトされる
%systemroot%\SysWOW64は、そのフォルダを参照する
%systemroot%\Sysnativeは、%systemroot%\system32にリダイレクトされる
WOW64環境で32ビットアプリケーションを実行する場合、%systemroot%\system32を指定すると%systemroot%\SysWOW64にリダイレクトされ、そのフォルダ内の同じ名前の実行プログラム(exeなど)が起動されます。
そのため通常はほとんど問題になる事はありません。
しかしwbadmin.exeは64ビット版は%systemroot%\system32フォルダに存在するのに、%systemroot%\SysWOW64フォルダに同名の32ビット版実行プログラムが存在しないため、バッチファイルを32ビットアプリケーション(JP1/AJS2)から実行すると、ファイルが見つからない現象となったわけです。
32ビットのジョブ実行アプリケーションからwbadmin.exeを呼び出す場合は、「%systemroot%\Sysnative\wbadmin.exe」と書かなければならないわけです。
しかしそのバッチファイルはエクスプローラーからダブルクリックしたりタスクスケジューラーから実行すると、64ビット環境には「%systemroot%\Sysnative」と言うエイリアスが存在しないため、このバッチファイルではwbadmin.exeの呼び出しできません。
バッチファイルが64ビット環境専用とか、32ビット環境専用とかになってしまうのは困るんですが、今のところそうしようもないですね。
根本的な解決は、お客さんのところのJP1がx64ネイティブに対応してくれれば済む話なんですが、いつになるかは今のところ分からないので、この状況は当分続きそうです。
- 関連記事
-
- VMware ESXiホストの設定バックアップとリストア(その2:リストア) (2014/01/27)
- VMware ESXiホストの設定バックアップとリストア(その1:バックアップ) (2014/01/26)
- VMware vSphere CLI 5.1 Update 1をインストールする (2013/12/28)
- x64版Windowsで32ビットアプリケーションから64ビットアプリケーションを呼び出すには%Systmroot%\Sysnativeを指定する (2013/12/27)
- VMware ESXi上の仮想マシンでNMIによりメモリダンプ作成を強制的に実行する (2013/12/24)
- VMware ESXiにsshで接続する (2013/12/23)
- VMware ESXiのESXi Shellにコンソール画面からログインする (2013/12/22)