[PHP-users 28390] Windows版exec経由で、ネットワークドライブのファイル一覧が取得できない。
Hiroyuki Toda
might @ nifty.com
2006年 2月 13日 (月) 19:04:37 JST
戸田と申します。
表題の件で少し困っております。
ご存知の方がいらっしゃいましたら、ご教授いただけないでしょうか。
[環境]
OS: Windows 2000
Webサーバ: Apache 2.0.52
PHP: 4.4.2 (SAPI)
確立済みのネットワークドライブ(ここではe:)のファイル一覧を、
exec()経由でdirコマンドで取得したいのですがうまくいきません。
コード:
exec("cmd /c \"dir e:\\\"", $output, $status);
print_r($output);
結果:
Array ( )
ところが、ローカルドライブ(ここではc:)を指定するとうまくいきいます。
コード:
exec("cmd /c \"dir c:\\\"", $output, $status);
print_r($output);
結果:
Array ( [0] => ドライブ C のボリューム ラベルは system です [1] => ボリューム シリアル番号は XXXX-XXXX です [2] => [3] => c:\ のディレクトリ
(以下略)
しょうがないので、WNetGetUniversalName() Win32APIを直接叩いて存在確認を
するWin32バイナリを作成して、それをexec()でコールしてみましたが、
やはりAPIからエラー(ERROR_NOT_CONNECTED)が返ってきてしまいました。
なお、コマンドプロンプトから直接実行すると、意図通りの動作しますので、
プログラムミスの可能性は少ないものと認識しています。
ちなみにhttp://www.microsoft.com/japan/msdn/library/ja/jpwnet/html/_win32_wnetgetuniversalname.aspで
調べると「ERROR_NOT_CONNECTED lpLocalPath パラメータで指定したデバイスはリダイレクトされていません。 」
となっているので、デバイスのリダイレクトが関係しているように思えます。
(Windowsにおけるデバイスのリダイレクトというものを、イマイチ理解できていないのですが)
現在の推論ですが、PHPからexec()を呼び出すとデバイスのリダイレクトが無効化されて実行
されるので、ネットワークドライブに対するdirや、WNetGetUniversalName()の呼び出しが
失敗しているように思えるのですが、いかがでしょうか。
(それともローカルデバイスをネットワーク資源にリダイレクトさせる前処理を、
明示的に実行する必要があるんでしょうか)
MLの過去ログを見ていると、Windows版exec()はかなり問題が多いみたいですね。
PHP5では解決されているのかもしれませんが、今回はPHP4の範囲で解決したいと考えております。
以上よろしくお願いします。
PHP-users メーリングリストの案内