16

在安装在 Windows XP 计算机上的 PHP (XAMPP) 中我试图读取本地网络服务器上存在的目录。我is_dir()用来检查它是否是我可以阅读的目录。

在 Windows 资源管理器中,我键入\\\server\dir并显示该目录。当我映射网络驱动器时,a 也可以访问它z:\dir

在 PHP 中,我有那个脚本:

<?php if( is_dir($dir){ echo 'success' } ) ?>

因为$dir我试过:

  • /server/dir
  • //server/dir
  • \server\dir
  • \\server\dir
  • \\\\server\\dir

  • z:\dir
  • z:\\dir
  • z:/dir
  • z://dir

但我永远不会成功?任何的想法?谢谢

4

4 回答 4

10

我通过更改服务器注册表中的一些内容来解决它,如本讨论的最后一个答案中所述:

http://bugs.php.net/bug.php?id=25805

无论如何都要感谢 VolkerK 和 Gumbo!我喜欢 stackoverflow 和他们伟大的人,他们以难以置信的速度帮助你!

编辑(取自 php.net):

该服务对网络资源(例如共享和管道)的访问权限有限,因为它没有凭据并且必须使用空会话进行连接。以下注册表项包含 NullSessionPipes 和 NullSessionShares 值,用于指定空会话可能连接到的管道和共享:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters 或者,您可以将 REG_DWORD 值 RestrictNullSessAccess 添加到项并将其设置为 0 以允许所有空会话访问在该机器上创建的所有管道和共享。

将 RestrictNullSessAccess=0 添加到您的注册表中。

于 2009-07-20T20:10:02.360 回答
9

您可能让 xampp 将 apache 安装为服务并通过该 apache 运行 php 脚本。并且不允许 apache 服务(作为localsystem运行)以您的用户帐户的方式访问网络。

在 LocalSystem 帐户的上下文中运行的服务会继承 SCM 的安全上下文。用户 SID 是根据 SECURITY_LOCAL_SYSTEM_RID 值创建的。该帐户未与任何已登录的用户帐户关联
这有几个含义:
...
   *该服务将计算机的凭据提供给远程服务器
...

您可以通过将 apache 作为控制台应用程序启动来测试这一点(xampp 目录中的 apache_start.bat 应该这样做)并再次运行脚本。您可以在 unc 路径中使用正斜杠和反斜杠。我建议使用 //server/share 因为 php 不关心 / 在字符串文字中。

<?php
$uncpath = '//server/dir';
$dh = opendir($uncpath);
echo "<pre>\n";
var_dump($dh, error_get_last());
echo  "\n</pre>";
于 2009-07-20T15:15:34.077 回答
3

尝试file:URI 方案:

file://server/dir
file:///Z:/dir

开始总是file://。下一个路径段是服务器。如果它在您的本地计算机上,请将其留空(参见第二个示例)。另请参阅Windows 中的文件 URI

于 2009-07-20T14:15:26.017 回答
0

是的,我知道这是一篇旧帖子,但我仍然找到了它,如果其他人找到了...

于 2020-01-17T15:54:08.713 回答