簡體   English   中英

PHP無法打開網絡文件

[英]PHP Can't Open Network File

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

但是,當我嘗試使用瀏覽器通過站點處理它時,它失敗並顯示錯誤:

“無法打開流:權限被拒絕”

在 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!");

更新:所以我在 CLI 和瀏覽器上運行 shell_exec("whoami") 。 當我在 CLI 中執行此操作時,它會顯示我正在運行 shell 的域帳戶。 但是,當我通過瀏覽器運行腳本時,它顯示“nt authority\\iusr”。 任何想法如何讓它在不同的用戶下運行? 在 IIS 中更改應用程序池標識似乎與我在測試中所知道的沒有區別。

echo shell_exec("whoami");

我能夠解決這個問題。 我必須進入 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而且還開始使用我在 IIS AppPool 中設置的域帳戶運行我的 PHP 腳本。 現在fopen按預期工作。

正如php 手冊所說,你應該使用 \\\\localservername\\c$\\inetpub\\wwwroot\\test.html

但由於 \\ 它是用於轉義其他特殊字符的保留字符,您應該像這樣將 \\ 的數量加倍:

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

如果它不起作用,您應該檢查運行 php 腳本的網絡服務器的用戶是否具有訪問該資源所需的權限

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM