【问题标题】:Access network share with PHP5.2 + IIS7.5使用 PHP5.2 + IIS7.5 访问网络共享
【发布时间】:2012-03-26 02:46:52
【问题描述】:

我正在使用带有 IIS7.5 的 php 5.2。

我在 NAS 上有一个受用户名和密码保护的网络共享。我无法禁用或更改 NAS 上的身份验证信息。我需要能够通过 php 访问该网络共享。

我做了以下事情:

在 Windows 中创建新用户,其用户名和密码与 NAS 上的用户名和密码匹配。 创建了使用相同身份验证信息的 IIS 应用程序池。 在 php app 目录中创建了一个 web.config 文件,并使用相同的身份验证信息打开了模拟。

identity impersonate="true" password="ThePass" userName="TheUser" />

在 IIS 的应用程序身份验证中打开 ASP.NET 模拟。

这似乎不适用于 php 中的这行简单代码:

$dir = opendir("\\someservername\somesharename"); 警告:opendir(\someservername\somesharename) [function.opendir]: failed to open dir: No error in C:\websites\site\forum\testing.php on line 7

所以,我决定用 ASP.NET 测试配置。

string[] 目录 = System.IO.Directory.GetDirectories("\\someservername\somesharename"); asp.net 测试运行良好。

进一步深入兔子洞,我运行了 phpinfo() 并检查了其中的用户名信息。在 phpinfo 的“环境”部分,我找到了“用户名”项。它的价值是“TheUser”,正如我所期望的那样。

在我尝试之前,一切都表明系统配置正确:

echo get_current_user(); 哪个返回,“IUSR”。这肯定不是我所期望的。

那么,我到底如何让 php + IIS7.5 从外部网络共享中读取?

更新:

感谢一些答案,我已经添加了

$result = shell_exec("net use o: \\\\pathToServer\\27301  /persistent:yes 2>&1");

返回成功。我仍然在opendir上收到错误。我尝试了另一个测试并使用了 is_dir。这在我新创建的映射驱动器上返回 false。

var_dump(is_dir("o:\\"));

// Prints: bool(false) 

更新

当我以创建的用户身份登录时,我从命令行运行了脚本。脚本正确执行。这能让我们回到返回 IUSR 的 get_current_user() 吗?我尝试了 getmypid() ,它返回了一个进程 ID。我用任务管理器交叉引用了那个进程ID,发现它是用于php-cgi.exe的,在我创建的自定义用户帐户下运行。

【问题讨论】:

  • 你见过this note(与挂载/访问相关)和this note与脚本进程的所有者(不是脚本的所有者)相关吗?
  • 第一个在这里不适用,他们使用的是 Apache,而不是 IIS。
  • 当您映射网络驱动器时,它的作用域是映射它的用户。您仍然只是通过 UNC 路径访问它。

标签: php iis-7.5


【解决方案1】:

在 PHP 中访问网络共享的推荐方法是“挂载”它。尝试将您的共享连接为网络驱动器。

顺便说一句。你的命令是错误的 $dir = opendir("\\someservername\somesharename"); 您必须使用 4 "\" 因为它是转义字符 $dir = opendir("\\\\someservername\somesharename");

注意:get_current_user() 返回 IIS 上进程的所有者

【讨论】:

    【解决方案2】:

    你可以通过映射来尝试测试

    $command = "net use $drive \"\\\\$ip\\$share\" $smb_password /user:$domain\\$smb_username";
    $result = shell_exec($command);
    

    在 opendir 上,您需要 \\\\$server_name\\$share 尝试使用 4 '\' 并且如果这样的映射有效并且 4 '\' 在 opendir 上失败。您的凭据可能不匹配。

    如果您以这种方式映射它,您在 Windows 中创建的用户名和密码与 NAS 上的用户名和密码匹配的新用户将拥有映射驱动器的权限,这样您就无需担心范围。

    【讨论】:

    • 映射驱动器工作正常。但是 open_dir 仍然失败。请参阅原始问题中的更新。
    • 您的 open_basedir 限制是什么,您可能需要检查这些限制,因为 is_dir 在映射驱动器上返回 false。
    • 来自 phpinfo: open_basedir no value no value
    • 我已经更新了帖子。我以特殊用户身份从命令行运行脚本,它运行正常。
    【解决方案3】:

    在类似的系统上遇到了同样的问题。通过转到网站 > 身份验证 > 匿名身份验证 > 将 IUSR 更改为您的用户名或使用正确配置的应用程序池用户来解决此问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-28
      • 2013-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多