2012-03-26 120 views
1

我使用php 5.2与IIS7.5。使用PHP5.2 + IIS7.5访问网络共享

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

我已经做了以下内容:在Windows

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

身份冒充= “真” 密码= “ThePass” 的userName = “TheUser”/>

在IIS在应用鉴定功能打开ASP.NET模拟。

无的,这似乎与代码在PHP这个简单的线路的工作:

$ DIR =执行opendir( “\\ someservername \ somesharename”); 警告:执行opendir(\ someservername \ somesharename)[function.opendir]:未能打开目录:C中没有错误:\网站\在线网站\论坛\ testing.php 7

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

string [] diretories = System.IO.Directory.GetDirectories(“\\ someservername \ somesharename”); asp.net测试工作完美。

继续往下走兔子洞,我跑了phpinfo()并检查了用户名信息。在phpinfo的“环境”部分,我找到了“USERNAME”项。它的价值是“TheUser”,正如我所预期的那样。

一切点,该系统被正确配置,直到我试图:

回波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) 

UPDATE

为创建的用户登录,当我跑的命令行脚本。脚本正确执行。这可以把我们带回到返回IUSR的get_current_user()吗?我tryied getmypid()返回一个进程ID。我交叉引用进程ID与任务管理器,发现它是为php-cgi.exe,运行在我所做的自定义用户帐户下。

+0

你见过[本说明](http://us3.php.net/manual/en/function.opendir.php#89091)(与安装/访问有关)和[本说明](http:// us3.php.net/manual/en/function.get-current-user.php#75059)与脚本进程的所有者有关(而不是脚本的所有者)? – chrisn 2012-03-26 03:27:17

+0

第一个不适用于这里,他们使用的是Apache,而不是IIS。 – Darthg8r 2012-03-26 18:19:16

+0

映射网络驱动器? – 2012-03-29 02:36:09

回答

2

您可以通过像

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

映射它执行opendir你需要有\\\\ $服务器名称\\ $尝试测试与4'\'共享尝试,如果这样的映射工作,并且4'\'在opendir上失败。您可能有不匹配的凭证。

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

+0

映射驱动器工作。但是open_dir仍然失败。请参阅原始问题中的更新。 – Darthg8r 2012-04-03 20:38:38

+0

对不起,打字错误,这是“opendir”没有改变的结果... – Darthg8r 2012-04-03 20:51:39

+0

什么是您可能想要检查这些因为is_dir在映射的驱动器上返回false的open_basedir限制。 – PoX 2012-04-04 14:23:40

4

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

Btw。您的命令是错误的 $ dir = opendir(“\\ someservername \ somesharename”); 您必须使用4“\”,因为它是转义字符 $ dir = opendir(“\\\\ someservername \ somesharename”);

注:get_current_user()返回过程的所有者在IIS

1

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