2010-04-07 213 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