2010-04-07 211 views
3

我已將網絡驅動器映射到家庭網絡中的計算機。現在,我試圖通過PHP訪問它 - 我這樣做快速測試:映射網絡驅動器

echo opendir('Z:\\'); 

這給了我:

Warning: opendir(Z:\) [function.opendir]: failed to open dir: No error in C:\wamp\www\webs\tester-function.php on line 3 

我做了什麼錯在這裏?

我不希望我的用戶在UNC路徑中鍵入,因此有沒有辦法獲得他們的UNC路徑,也許這將在我嘗試訪問它時起作用?這在Microsoft語言中是可能的,但我不確定如何讓PHP執行此操作 - 也許使用cmd.exe命令?

請注意,映射的驅動器存在,因爲我可以看到它,我可以訪問它。它也似乎不是一個權限問題,因爲我假設它會抱怨如果它可以訪問該驅動器...對不對?

感謝所有的幫助

+0

*(相關)* http://bugs.php.net/40117 – Gordon 2010-04-07 14:05:05

+0

這個腳本是由一個由web服務器創建的php實例執行的嗎?這個網絡服務器是作爲一項服務運行嗎?此服務是以'localsystem'運行還是使用其他帳戶?您是爲哪個帳戶創建驅動器映射(您自己的還是服務的帳戶)? – VolkerK 2010-04-07 14:26:06

+0

是的,一個由Web服務器創建的php實例。是的,Web服務器作爲服務運行。是作爲'localsystem'。這個映射的驅動器是由我創建的,而不是'localsystem'。但是,'localsystem'具有爲該映射驅動器自動設置的權限。 – Abs 2010-04-07 14:37:59

回答

5

User Contributed Notes to opendir()有這樣的:

我試圖訪問使用此功能執行opendir網絡驅動器。我讀了很多帖子,說幾乎不可能訪問網絡驅動器,最後,我找到了答案;有兩個步驟可以在同一臺機器或另一臺機器上使用PHP訪問網絡驅動器。

在這種情況下,用戶權限似乎確實是問題,根據運行的用戶PHP/Web服務器的不同,這可能與您的權限不同。

+0

這很有趣! Apache以用戶'SYSTEM'的身份運行 - 在權限設置中 - 映射驅動器的用戶'SYSTEM'能夠讀取驅動器。這樣,我已經完成了這兩個步驟,但仍然無法工作。也許我誤解了一些東西? – Abs 2010-04-07 14:25:48

+0

你是如何創建驅動器映射的?爲您的帳戶創建驅動器映射並不意味着Web服務器的進程/帳戶獲得相同的映射。 – VolkerK 2010-04-07 14:28:39

+0

@Abs很難說。也許嘗試在鏈接評論中列出的特定用戶帳戶下運行該服務,以查看它是否以這種方式工作? – 2010-04-07 14:29:44

2

通過轉到開始 - >運行(或使用搜索框,如果使用Windows 7)並輸入Services.msc並按下回車鍵打開Services MMC。 查找Apache服務。從未使用過WAMP,我不知道它的名字。希望它始於「Apache」這個詞,因此不應該太難找到。 右鍵單擊服務並選擇「屬性」。 切換到登錄選項卡。 選擇「此帳戶:」旁邊的單選按鈕,然後輸入您要運行Apache的用戶帳戶的憑據。如果是網絡/域帳戶,請使用「DOMAIN \ user」語法(或使用「瀏覽」按鈕搜索帳戶)。 選擇確定並重新啓動Apache服務。 通過在任務管理器中查找「httpd.exe」進程並檢查以查看該進程正在運行的用戶名,確認您的更改正常工作。

參考http://board.phpbuilder.com/board/showthread.php?t=10371870&page=2

+0

很好的回答! +1 – 2014-04-27 17:29:22

+0

請務必通過更改運行Apache的用戶來了解您所做的安全隱患。作爲本地系統帳戶使其能夠有限訪問文件結構的重要區域,並且無法訪問網絡。通過改變這一點,您可能會訪問受保護區域以及用戶擁有的任何網絡訪問權限。這可能意味着一旦有人侵入你的程序,他們將有權訪問整個計算機和網絡(以便能夠放置文件)。如果可能的話,嘗試在Apache和Windows內置的安全性範圍內找到一種方法。 – Robert 2015-06-28 21:15:23

3

簡單,使用:"\\\\server\\dir\\subfolder"作爲路徑。確保你可以訪問「服務器」。

適合我。
$arquivo = "\\\\server\\dir\\subfolder\\file.txt"; echo is_file($arquivo); //print 1.

+0

這對我來說很好,在嘗試之前嘗試了很多其他方法。至少在我的情況下,無需爲此更改任何權限。 – user3101337 2014-12-03 01:44:29