2012-03-26 337 views
1

私はIIS7.5でphp 5.2を使用しています。PHP5.2 + IIS7.5でネットワーク共有にアクセス

私はNAS上にユーザー名とパスワードで保護されたネットワーク共有を持っています。 NASの認証情報を無効にしたり変更したりすることはできません。私は、PHPを介してそのネットワーク共有にアクセスできるようにする必要があります。

私は次のことをやった:

は、ユーザー名とパスワードをNAS上のものと一致したウィンドウに新規ユーザーを作成しました。 この同じ認証情報を使用するIISアプリケーションプールを作成しました。 同じ認証情報を使用して、偽装をオンにしてphpアプリケーションディレクトリ内にweb.configファイルを作成しました。

身元偽装= "true" のパスワード= "ThePass" のuserName = "TheUser" /> IISでアプリケーション認証でASP.NETの偽装に回さ

。この

どれもPHPのコードのこのシンプルなラインで動作するように見えた:

$ dirを=のopendir( "\\ someservername \ somesharename"); 警告:opendir(\ someservername \ somesharename)[function.opendir]:dirを開くことに失敗しました:C:\ websites \ site \ forum \ testing.php 7行目でエラーなし

ASP.NETを使用した構成

string [] diretories = System.IO.Directory.GetDirectories( "\\ someservername \ somesharename"); asp.netテストは完全に機能しました。

さらにウサギの穴を通って、phpinfo()を実行して、その中のユーザー名情報を確認しました。 phpinfoの "Environment"セクションで、 "USERNAME"という項目が見つかりました。私の期待通りに、その価値は "The User"でした。私は試みまで、システムに

すべてポイントが正しく構成されている:

エコーget_current_userを(); 「IUSR」が返されました。確かに私が期待したものではありません。

だから、世界のどのように私はPHP + IIS7.5を外国のネットワーク共有から読み込むのですか?

更新:回答の数に

おかげで、私は成功を返し

$result = shell_exec("net use o: \\\\pathToServer\\27301 /persistent:yes 2>&1"); 

を追加しました。私はまだopendirでエラーを取得しています。別のテストを試み、is_dirを使用しました。これは、新しく作成されたマップされたドライブでfalseを返しました。

var_dump(is_dir("o:\\")); 

// Prints: bool(false) 

UPDATE

作成したユーザーとしてログインしたとき、私は、コマンドラインからスクリプトを実行しました。スクリプトは正しく実行されます。これはIUSRを返すget_current_user()に戻ることができますか?私はプロセスIDを返したgetmypid()を試しました。私はそのプロセスIDをタスクマネージャーに渡し、自分が作成したカスタムユーザーアカウントで実行されているphp-cgi.exeであることを発見しました。

+0

[このノート](http://us3.php.net/manual/en/function.opendir.php#89091)(マウント/アクセスに関する)と[このメモ](http:// us3.php.net/manual/en/function.get-current-user.php#75059)(スクリプトの所有者ではなく)スクリプトのプロセスの所有者に関連していますか? – chrisn

+0

最初のものはここでは適用されません。IISではなくApacheを使用していました。 – Darthg8r

+0

地図ネットワークドライブ? –

答えて

2

上のプロセスの所有者を返しget_current_user()あなたは\\\\ $ SERVER_NAME \\ $を持っている必要がありますopendirなどに

$command = "net use $drive \"\\\\$ip\\$share\" $smb_password /user:$domain\\$smb_username"; 
$result = shell_exec($command); 

のようにそれをマッピングすることにより、テストを試すことができます4 '\'で試してみてください。もしそれがうまくマッピングされ、4 '\'がopendirで失敗したら。一致しない資格情報があるかもしれません。

この方法でマップした場合、ユーザー名とパスワードがNASのものと一致する新しいユーザーは、マップされたドライブの権利を持っているため、範囲を気にする必要はありません。

+0

ドライブのマッピングが機能しました。しかし、open_dirはまだ失敗します。元の質問の更新を参照してください。 – Darthg8r

+0

申し訳ありません、 "opendir"です。結果に変更はありません... – Darthg8r

+0

is_dirがマップされたドライブでfalseを返すので、あなたのopen_basedirの制限は何ですか? – PoX

4

PHPでネットワーク共有にアクセスするには、それを「マウント」することをお勧めします。共有をネットワークドライブとして接続しようとします。

Btw。あなたのコマンドは間違っています $ dir = opendir( "\\ someservername \ somesharename"); エスケープ文字であるため4 "\"を使用する必要があります $ dir = opendir( "\\\\ someservername \ somesharename");

注:IIS

1

同様のシステムで同じ問題が発生しました。 Webサイト>認証>匿名認証>ユーザー名が何であれIUSRを変更するか、正しく設定されている場合はアプリケーションプールユーザーを使用して解決します。

関連する問題