2012-03-26 163 views
1

我使用php 5.2與IIS7.5。使用PHP5.2 + IIS7.5訪問網絡共享

我在NAS上有一個用戶名和密碼保護的網絡共享。我無法禁用或更改NAS上的身份驗證信息。我需要能夠通過php訪問該網絡共享。

我已經做了以下內容:在Windows

創建新的用戶,其用戶名和密碼相匹配的NAS上。 創建使用此相同的身份驗證信息的IIS應用程序池。 使用相同的身份驗證信息在打開模擬的情況下在php應用程序目錄內創建一個web.config文件。

身份冒充= 「真」 密碼= 「ThePass」 的userName = 「TheUser」/>

在IIS在應用鑑定功能打開ASP.NET模擬。

無的,這似乎與代碼在PHP這個簡單的線路的工作:

$ DIR =執行opendir( 「\\ someservername \ somesharename」); 警告:執行opendir(\ someservername \ somesharename)[function.opendir]:未能打開目錄:C中沒有錯誤:\網站\在線網站\論壇\ testing.php 7

所以,我決定測試使用ASP.NET進行配置。

string [] diretories = System.IO.Directory.GetDirectories(「\\ someservername \ somesharename」); asp.net測試工作完美。

繼續往下走兔子洞,我跑了phpinfo()並檢查了用戶名信息。在phpinfo的「環境」部分,我找到了「USERNAME」項。它的價值是「TheUser」,正如我所預期的那樣。

一切點,該系統被正確配置,直到我試圖:

回波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()嗎?我tryied getmypid()返回一個進程ID。我交叉引用進程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 2012-03-26 03:27:17

+0

第一個不適用於這裏,他們使用的是Apache,而不是IIS。 – Darthg8r 2012-03-26 18:19:16

+0

映射網絡驅動器? – 2012-03-29 02:36:09

回答

2

您可以通過像

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

映射它執行opendir你需要有\\\\ $服務器名稱\\ $嘗試測試與4'\'共享嘗試,如果這樣的映射工作,並且4'\'在opendir上失敗。您可能有不匹配的憑證。

如果以這種方式映射它,您在用戶名和密碼與NAS上的用戶名和密碼相匹配的窗口中創建的新用戶將擁有映射驅動器的權限,這樣您就不必擔心範圍。

+0

映射驅動器工作。但是open_dir仍然失敗。請參閱原始問題中的更新。 – Darthg8r 2012-04-03 20:38:38

+0

對不起,打字錯誤,這是「opendir」沒有改變的結果... – Darthg8r 2012-04-03 20:51:39

+0

什麼是您可能想要檢查這些因爲is_dir在映射的驅動器上返回false的open_basedir限制。 – PoX 2012-04-04 14:23:40

4

在PHP中訪問網絡共享的推薦方式是「掛載」它。嘗試將您的共享作爲網絡驅動器連接。

Btw。您的命令是錯誤的 $ dir = opendir(「\\ someservername \ somesharename」); 您必須使用4「\」,因爲它是轉義字符 $ dir = opendir(「\\\\ someservername \ somesharename」);

注:get_current_user()返回過程的所有者在IIS

1

在類似的系統上有同樣的問題。通過訪問網站解決此問題>身份驗證>匿名身份驗證>將IUSR更改爲您的用戶名或使用應用程序池用戶(如果配置正確)。