[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 メーリングリストの案内