【问题标题】:Unable to connect to network share无法连接到网络共享
【发布时间】:2012-12-14 19:11:50
【问题描述】:

我正在尝试从浏览器连接到网络共享(通过它是 UNC),但无法连接。

如果我从命令行运行我的脚本,一切都很好,我可以访问共享。我还可以通过 Windows 的文件资源管理器导航到它,所以我认为我的代码或我的 Windows 帐户的权限没有任何问题。

我的脚本如下所示:

$dir = '\\\\some\path';

if (is_dir($dir))
{
    echo 'dir exists';
} 
else
{
    echo 'dir does not exist';
}

我也尝试过使用DirectoryIterator($dir),但这会引发此异常错误: PHP Warning: opendir(...): Access is denied. (code: 5)

这是我的设置:
- Windows Server 2008 R2
- IIS 7.5
- PHP 5.3.13
- 匿名身份验证已禁用
- 启用 Windows 身份验证

我的 php.ini 中有这些配置设置:

cgi.force_redirect=0
cgi.fix_pathinfo=1
fastcgi.impersonate=1

为了增加混乱,我能够在以下情况下通过浏览器进行连接:

1 - 使用 system("net use \"".$dir."\" ".$pass." /user:".$user." /persistent:no>nul 2>&1"); 但这需要硬编码用户的 Windows 身份验证密码,我不能这样做。

2 - 设置fastcgi.impersonate=0 但这意味着用户每次点击脚本时都必须进行身份验证,这是不可接受的。

3 - 启用匿名身份验证,禁用 Windows 身份验证,但我需要启用 Windows 身份验证才能知道谁在访问该站点。

我不知道这是否与我的问题有关,但是从浏览器和命令行运行我的脚本时,$_SERVER['USERNAME'] 的值不同。

这是权限问题吗?是否存在未传递的身份验证令牌?

编辑
不幸的是,在这种情况下,将共享映射到网络驱动器不是一种选择。

【问题讨论】:

    标签: php iis network-share


    【解决方案1】:

    它应该可以工作,但您需要运行 php 进程的用户才能访问该路径。

    在您的情况下,如果不在域中,您可以尝试在您的服务器上创建一个用户并将其设置为应用程序池所有者。然后您在另一台计算机上创建相同的用户/密码并授予对共享文件夹的访问权限。

    看起来很难看,我同意,但应该可以。

    编辑

    或者是的,按照尼尔的建议,创建一个映射文件夹。可能会更容易。

    编辑 2

    假设您不在域中,要创建用户并分配它以运行应用程序,请执行以下操作:

    1. 创建用户

    2. 运行 iismanager 并设置用户运行应用程序

    最后一步是在您共享路径的远程服务器上创建完全相同的用户(也包括密码),并在安全选项卡中添加该用户并拥有您需要的权限。

    你可能需要重启iis:iisreset

    【讨论】:

    • 如何找到运行 php 进程的用户?那会是get_current_user()吗?
    • 最简单的方法:创建一个新的并确保它是运行应用程序的那个。如果需要,我可以编辑答案并添加打印屏幕。
    • 是的,这将非常有帮助。谢谢。
    【解决方案2】:

    您不能在 PHP 中使用 UNC 路径轻松访问文件。

    尝试制作映射的网络驱动器。

    【讨论】:

    • 不幸的是,将其映射为驱动器对我来说不是一个选项。我见过很多人使用 PHP 连接到 UNC,而我的脚本是从命令行运行的,所以它一定是可能的。
    猜你喜欢
    • 1970-01-01
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    • 2022-10-05
    • 1970-01-01
    • 2015-05-20
    相关资源
    最近更新 更多