2016-12-27 107 views
0

我有一個網站使用在IIS中的Windows Server 2012 R2上運行的PHP腳本。我正嘗試使用fopen來讀取網絡中另一臺服務器上的文件,但遇到問題。我可以使用fopen命令打開本地服務器上的文件並使用PHP CLI,我可以在遠程服務器上成功打開文件。PHP無法打開網絡文件

然而,當我嘗試使用我的瀏覽器通過該網站處理它,它失敗,出現錯誤:

"failed to open stream: Permission denied"

在IIS中,我創建了一個新的應用程序池,並設置其身份以域管理員,其有管理員訪問這兩個服務器,但這似乎沒有幫助。這與我在運行CLI時使用的帳戶相同。

下面是我用我的PHP腳本代碼:

fopen("//remoteservername/c$/inetpub/wwwroot/test.html", "w") or die("Can't open file!"); 

我用反斜槓(與逃脫之輩)嘗試。我試過在路徑前面使用FILE://。我試圖將遠程服務器的驅動器映射到運行PHP的Web服務器,並使用Y:\ inetpub之類的路徑...我試過使用「rb」而不是「w」,因爲它們都是Windows服務器。

我覺得它與網站運行的帳戶/身份有關,但我不確定它爲什麼在我改變它後仍然不能工作。

更新:我提到的fopen作品讀取本地服務器上的文件,但它似乎如果我使用如下的相對路徑是唯一真正的...

fopen("test.html", "w") or die("Can't open file!"); 

如果我嘗試打開的是同一個文件本地服務器使用如下所示的絕對路徑,它失敗。所以我不相信了它的身份問題......

fopen("//localservername/c$/inetpub/wwwroot/test.html", "w") or die("Can't open file!"); 

更新:所以,我跑了shell_exec同時在CLI和通過瀏覽(「WHOAMI」)。當我在CLI中執行它時,它會顯示我正在運行shell的域帳戶。但是,當我通過瀏覽器運行腳本時,它顯示「nt authority \ iusr」。任何想法如何讓它在不同的用戶下運行?在IIS中更改應用程序池標識似乎與我在測試中可以看到的不同。

echo shell_exec("whoami"); 
+0

如果有任何幫助,很久以前我就與PHP/IIS和網絡驅動器進行了鬥爭。該網站的管理員/開發人員發現不同用戶報告的行爲不一致。這是一個使用NTLM進行身份驗證的Intranet應用程序。我們唯一能夠解釋這種行爲的合理解釋是,PHP代碼是通過NTLM(erk!)提供的權限運行的。我們從未完全驗證過這一點。 – symcbean

回答

2

OK我能把這個解決的權限。我必須進入IIS> FastCGI設置>選擇我的PHP應用程序>單擊右側的編輯>展開高級菜單>將協議從NamedPipe更改爲Tcp。

我遇到這種情況的方式是我在另一臺運行PHP的Windows服務器上進行了測試,並且它使用了在AppPool中設置的正確帳戶/標識。所以我在我的服務器上安裝一個新的站點來測試,我甚至不能運行 echo shell_exec(「whoami」);當我開始排除故障時,我遇到了這個網站:http://tech.trailmax.info/2012/12/php-warning-shell_exec-unable-to-execute-on-iis-7/

我遵循這些步驟,不僅解決了我的問題,無法運行shell_exec,而且還開始使用我設置的域帳戶運行我的PHP腳本IIS AppPool。現在我的fopen按預期工作。

+1

哇,我認爲這只是幫助我的時間。我一直在用一個Web應用程序掙扎了好幾天,這個應用程序在UNC共享上扮演着文件管理員的角色。如果我有IIS匿名訪問,它的工作完美,但我需要以某種方式阻止用戶的網絡用戶名(只是爲了記錄誰做了什麼,真的)。所以,我關閉了匿名功能,但啓用了Windows身份驗證。當試圖在UNC共享上創建一個新文件時,fopen會失敗。但是執行這個小技巧似乎已經解決了這個問題。謝謝 !! – DaveyBoy

0

由於php manual說,你應該使用\\ localservername \ C $ \的Inetpub \ wwwroot的\ test.html的

但隨着\這是一個逃跑的保留字符其他特殊字符,你應該加倍數像這樣的\:如果它不工作

fopen("\\\\localservername\\c$\\inetpub\\wwwroot\\test.html", "w") or die("Can't open file!"); 

,你應該檢查,如果它的運行PHP腳本web服務器的用戶有權限即可訪問該資源。

管理共享(drive + $)通常只允許管理員使用。

恕我直言,它應該是最好創建一個共享文件夾與網絡服務器的用戶,而不是使用管理共享(C $)

+0

我提到在我原來的帖子中嘗試反斜槓,包括像你的例子一樣的額外的。我使用whoami和get_current_user()檢查了當前用戶,並且它顯示它正在「NT Authority \ IUSR」下運行,即使我的IIS網站使用以域帳戶作爲其身份的應用程序池。我認爲這是問題,但不知道如何解決它。我試着給IUSR完全訪問test.html文件,但它沒有改變。而且我知道我使用的是管理共享,但也測試過在服務器上創建共享,就像您所建議的那樣,但仍然沒有任何變化。任何其他想法?謝謝 – Sina

+0

以下是PHP錯誤日誌顯示的內容。第一個示例是嘗試使用C $管理共享進行訪問。第二個例子是使用我創建並分配權限的名爲「test」的共享文件夾。 [28-Dec-2016 08:14:00 America/Los_Angeles] PHP警告:fopen(\\ localservername \ c $ \ inetpub \ wwwroot \ test.html):無法打開流:權限在C:\ inetpub中被拒絕\ wwwroot \ test.php on line 100 [28-Dec-2016 08:15:09 America/Los_Angeles] PHP警告:fopen(\\ localservername \ test \ test.html):無法打開流:權限被拒絕在線100上的C:\ inetpub \ wwwroot \ test.php – Sina

+0

很明顯,這是權限問題。您是否嘗試向共享上的「所有」用戶添加完整權限,僅用於測試?此外,我認爲NT Authority \ IUSR它是一個本地用戶,它只能在IIS機器上工作。它不是域用戶,所以它不會在另一臺機器上擁有權限。您應該編輯池並使用非本地帳戶,您將在第二臺機器上爲其添加權限。 – NetVicious