【发布时间】: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的,在我创建的自定义用户帐户下运行。
【问题讨论】:
-
第一个在这里不适用,他们使用的是 Apache,而不是 IIS。
-
当您映射网络驱动器时,它的作用域是映射它的用户。您仍然只是通过 UNC 路径访问它。