我正在使用 php 5.2 和 IIS7.5。
我的 NAS 上有一个受用户名和密码保护的网络共享。我无法禁用或更改 NAS 上的身份验证信息。我需要能够通过 php 访问该网络共享。
我做了以下事情:
在 Windows 中创建新用户,其用户名和密码与 NAS 上的用户名和密码一致。创建使用相同身份验证信息的 IIS 应用程序池。使用相同的身份验证信息在打开模拟的情况下在 php 应用程序目录内创建了一个 web.config 文件。
身份模拟=“true”密码=“ThePass”userName=“TheUser”/>
在 IIS 中的应用程序身份验证中启用了 ASP.NET 模拟。
这一切似乎都不适用于 php 中的这行简单代码:
$dir = opendir("\\someservername\somesharename"); 警告: opendir(\someservername\somesharename) [function.opendir]: 无法打开目录:第 7 行 C:\websites\site\forum\testing.php 中没有错误
因此,我决定使用 ASP.NET 来测试配置。
string[] diretories = System.IO.Directory.GetDirectories("\\someservername\somesharename"); asp.net 测试完美运行。
进一步深入兔子洞,我运行 phpinfo() 并检查其中的用户名信息。在 phpinfo 的“环境”部分中,我找到了“用户名”项。正如我所期望的,它的值是“TheUser”。
一切都表明系统配置正确,直到我尝试:
回显 get_current_user(); 返回的是“IUSR”。这肯定不是我所期望的。
那么,我到底如何让 php + IIS7.5 从国外网络共享中读取数据呢?
更新:
感谢一些答案,我添加了
$result = shell_exec("net use o: \\\\pathToServer\\27301 /persistent:yes 2>&1");
Run Code Online (Sandbox Code Playgroud)
返回成功。我仍然在 opendir 上遇到错误。我尝试了另一个测试并使用 is_dir。这在我新创建的映射驱动器上返回 false。
var_dump(is_dir("o:\\"));
// Prints: bool(false)
Run Code Online (Sandbox Code Playgroud)
更新
当我以创建的用户身份登录时,我从命令行运行了该脚本。脚本正确执行。这能让我们回到返回 IUSR 的 get_current_user() 吗?我尝试了 getmypid(),它返回了一个进程 ID。我与任务管理器交叉引用该进程 ID,发现它是用于 php-cgi.exe,在我创建的自定义用户帐户下运行。
在 PHP 中访问网络共享的推荐方法是“挂载”它。尝试将您的共享连接为网络驱动器。
顺便提一句。你的命令是错误的 $dir = opendir("\\someservername\somesharename"); 您必须使用 4 个“\”,因为它是转义字符 $dir = opendir("\\\\someservername\somesharename");
注意:get_current_user()返回 IIS 上进程的所有者