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