我使用php 5.2和IIS7.5。
我在NAS上拥有用户名和密码保护的网络共享。我无法在NAS上禁用或更改身份验证信息。我需要能够通过php访问该网络共享。
我做了以下事情:
在Windows中创建了新用户,其用户名和密码与NAS上的用户名和密码相匹配。 创建使用此相同身份验证信息的IIS应用程序池。 在php app目录中创建了一个web.config文件,并使用相同的身份验证信息打开了模拟。
identity impersonate =" true"密码=" ThePass"的userName =" TheUser" />
在IIS中的应用程序身份验证中启用了ASP.NET模拟。
这些似乎都不适用于php中这段简单的代码:
$ dir = opendir(" \\ someservername \ somesharename"); 警告:opendir(\ someservername \ somesharename)[function.opendir]:无法打开dir:第7行的C:\ websites \ site \ forum \ testing.php没有错误
所以,我决定用ASP.NET测试配置。
string [] diretories = System.IO.Directory.GetDirectories(" \\ someservername \ somesharename"); asp.net测试工作得很好。
进一步沿着兔子洞走,我跑了phpinfo()并检查了其中的用户名信息。在"环境"在phpinfo部分,我找到了" USERNAME"项目。它的价值是" 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)
更新
我以创建的用户身份登录时从命令行运行脚本。脚本正确执行。这会把我们带回get_current_user(),返回IUSR吗?我尝试了getmypid(),它返回了一个进程ID。我与任务管理器交叉引用该进程ID,发现它是用于php-cgi.exe,在我自定义用户帐户下运行。
答案 0 :(得分:4)
在PHP中访问网络共享的推荐方法是“挂载”它。尝试将您的共享连接为网络驱动器。
顺便说一下。你的命令是错的 $ dir = opendir(“\\ someservername \ somesharename”); 你必须使用4“\”,因为它是转义字符 $ dir = opendir(“\\\\ someservername \ somesharename”);
注意:get_current_user()返回IIS上进程的所有者
答案 1 :(得分:2)
您可以通过映射来尝试测试
$command = "net use $drive \"\\\\$ip\\$share\" $smb_password /user:$domain\\$smb_username";
$result = shell_exec($command);
在opendir上你需要\\\\ $ server_name \\ $ share尝试使用4'\'并且如果这样的映射有效且4'\'在opendir上失败。您的证书可能不匹配。
如果您以这种方式映射,那么您在用户名和密码与NAS上的用户名和密码匹配的窗口中创建的新用户将拥有映射驱动器的权限,这样您无需担心范围。
答案 2 :(得分:1)
在类似系统上遇到同样的问题。通过访问网站解决了这个问题>身份验证>匿名身份验证>将IUSR更改为您的用户名,或者如果配置正确,则使用应用程序池用户。