【问题标题】:Mapped Network Drives映射网络驱动器
【发布时间】:2010-04-07 13:46:14
【问题描述】:

我已将网络驱动器映射到家庭网络中的计算机。现在我正在尝试通过 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 命令?

请注意,映射驱动器确实存在,我可以看到它并且我可以访问它。它似乎也不是权限问题,因为我假设它会抱怨这个如果它可以访问该驱动器......对吗?

感谢大家的帮助

【问题讨论】:

  • (相关) bugs.php.net/40117
  • 这个脚本是由一个由网络服务器创建的 php 实例执行的?该网络服务器是否作为服务运行?该服务是以localsystem 运行还是使用其他帐户?您为哪个帐户(您自己的帐户或服务帐户)创建驱动器地图?
  • 是的,一个由网络服务器创建的 php 实例。是的,网络服务器作为服务运行。是的localsystem。这个映射驱动器是由我创建的,而不是 localsystem。但是,localsystem 自动为此映射驱动器设置了权限。

标签: php filesystems unc shared-directory mapped-drive


【解决方案1】:

User Contributed Notes to opendir() 有这个:

我试图使用这个 opendir 函数访问网络驱动器。我看了很多帖子说几乎不可能访问网络驱动器,最后我找到了答案;在同一台机器或另一台机器上使用 PHP 访问网络驱动器需要执行 2 个步骤。

在这种情况下,用户权限似乎确实是问题所在,这可能与您的权限不同,具体取决于运行 PHP/Web 服务器的用户。

【讨论】:

  • 这很有趣! Apache 以用户 'SYSTEM' 身份运行 - 在权限设置中 - 映射驱动器具有用户 'SYSTEM' 能够读取驱动器。这样,我已经完成了这两个步骤,它仍然不起作用。也许我误解了什么?!
  • 您是如何创建驱动器映射的?为您的帐户创建驱动器映射并不意味着网络服务器的进程/帐户获得相同的映射。
  • @Abs 很难说。也许尝试在链接评论中概述的特定用户帐户下运行服务,只是为了看看它是否以这种方式工作?
  • 我会试试这个。 @VolkerK - 我使用以“Abs-PC”身份登录的法线地图驱动器网络驱动器向导。一旦我这样做了,还有其他用户和用户组设置了权限(全部至少读取)其中之一是 SYSTEM,httpd 服务恰好在其下运行。
  • @Abs:看看msdn.microsoft.com/en-us/library/aa363908%28v=VS.85%29.aspx。您已经在 local MS-DOS 设备命名空间中创建了一个网络驱动器。
【解决方案2】:

通过转到开始 -> 运行(或使用搜索框,如果使用 Windows 7)并键入 Services.msc 并按 Enter,打开服务 MMC。 找到 Apache 服务。从未使用过 WAMP,我不知道它被命名为什么。希望它以“Apache”这个词开头,因此不应该太难找到。 右键单击服务并选择属性。 切换到登录选项卡。 选择“此帐户:”旁边的单选按钮,然后输入要在其下运行 Apache 的用户帐户的凭据。如果是网络/域帐户,请使用“DOMAIN\user”语法(或使用“浏览”按钮搜索该帐户)。 选择确定并重新启动 Apache 服务。 通过在任务管理器中查找“httpd.exe”进程并检查该进程在哪个用户名下运行来验证您的更改是否有效。

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

【讨论】:

  • 通过更改运行 Apache 的用户,请务必了解您所做操作的安全隐患。作为本地系统帐户,它可以有限地访问文件结构的重要区域,并且不能访问网络。通过更改此设置,您可能会授予对受保护区域和用户拥有的任何网络访问权限的访问权限。这可能意味着一旦有人破解了您的程序,他们就可以访问您的整个计算机和您的网络(以便能够放置文件)。如果可能,请尝试在 Apache 和 Windows 内置的安全范围内找到一种方法。
【解决方案3】:

简单,使用:"\\\\server\\dir\\subfolder" 作为路径。确保您可以访问“服务器”。

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

【讨论】:

  • 这对我来说效果很好,在开始之前尝试了很多其他方法。至少在我的情况下,无需为此更改任何权限。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多