PHP的exec()无法访问网络驱动器

时间:2011-12-15 18:03:30

标签: php apache networking exec drive

在PHP中,我通过调用exec("dir ...")列出了一些文件。但是,这奇怪地只适用于本地驱动器。在网络驱动器上,它具有非零结果状态代码,并且不返回任何结果。

我在Windows XP Professional上运行Apache。

有什么技巧可以解决这个问题吗?或者查看错误消息?

编辑:apache和我一样在同一个用户下运行,我可以从命令行执行此操作

1 个答案:

答案 0 :(得分:4)

我打算说“你不能从命令行做到这一点”,我确信过去是真的,但我刚试过WinXP Pro SP3并且它正在工作,只是为了恶意我

我不得不让PHP在一段时间之前与网络驱动器交谈(当时我在PHP世界中显得更加环保),我有一个噩梦让它工作,但最终我设法让它工作执行以下操作:

  • 在“服务”MMC管理单元中,将Apache运行的用户帐户更改为本地用户。它可能会被设置为SYSTEM,并且(AFAIK)该帐户无法访问网络驱动器。执行此操作后,您需要重新启动服务。
  • 在尝试访问之前添加以下行:system('net use Z: "\\servername\sharename" PASSWORD /user:USERNAME /persistent:no');,您可以在其中更改驱动器号,UNC路径,用户名等以符合您的要求。即使已映射驱动器,也请执行此操作。我似乎记得我必须使用system()而不是exec()shell_exec()或者它不起作用 - 因此,您需要输出缓冲区来停止输出传递到STDOUT。

我不知道为什么会这样,但确实如此。但请注意,我尝试将驱动器与opendir()fopen()等本机PHP函数一起使用,而不是尝试exec()针对它的外部程序。

如果要查看来自dir的呼叫的错误消息,请将2>&1附加到命令的末尾。这会将STDERR重定向到STDOUT,因此您应该在exec()的结果中获取错误消息。

所以你的行看起来像:

exec("dir Z:\\some\\path 2>&1")