【问题标题】:php Failed to open stream error for some users but not othersphp Failed to open stream error for some users but not others
【发布时间】:2015-10-22 15:11:49
【问题描述】:

我一直在搜索有关此错误的 StackExchange 主题,但没有找到任何与我所遇到的情况相符的主题。

我目前的状态是我有一个网页,其中包含使用 d3.js 设置的可视化,其中一些对象是可点击的。单击其中一个后,将通过 AJAX 执行 php 脚本(根据单击的对象传递变量),通过该脚本对 MSSQL 数据库运行查询,该数据库返回要通过 FTP 检索的图像列表。到目前为止,我知道这部分是有效的。

代码托管在运行 IIS 的 Win 2008 r2 服务器上。

检索图像数组后,将执行一个循环,查看它们是否已下载,如果没有,则在下面的循环中通过 FTP 获取图像:

        if(in_array($fileName,$files)) {
            //*** Look to see if the image has already been FTP'd
            $fileTo = "C:/inetpub/wwwroot/IRIS/images/" . $fileName;
        } else {
            $FTP_HOST = $wrow["serverId"] . ".prod.com";

            // *** Create the FTP object
            $ftpObj = new FTPClient();

            // *** Connect
            try{
                $ftpObj->connect($FTP_HOST,$FTP_USER,$FTP_PASS);
            } catch (PDOException $uc) {
                header('Content-type: application/json');
                echo json_encode("Error making the FTP connection");
                die();
            }

            $fileFrom = $wrow["fileSpec"];
            $fileTo = "C:/inetpub/wwwroot/IRIS/images/" . $fileName;

            try {
                $ftpObj->downloadFile($fileFrom,$fileTo);
            }catch (PDOException $uc) {
                header('Content-type: application/json');
                echo json_encode("Error transfering the file");
                die();
            }
        }

代码进入最后的 try/catch 循环,调用我在 downloadFile 所在的 FTP 类。请注意,在建立连接时,所有用户都使用相同的用户名和密码。

在ftp_class.php中连接如下:

public function connect ($server, $ftpUser, $ftpPassword, $isPassive = false) {

    // *** Set up basic connection
    $this->connectionId = ftp_connect($server);

    // *** Login with username and password
    $loginResult = ftp_login($this->connectionId, $ftpUser, $ftpPassword);

    // *** Sets passive mode on/off (default off)
    ftp_pasv($this->connectionId, $isPassive);

    // *** Check connection
    if ((!$this->connectionId) || (!$loginResult)) {
        $this->logMessage('FTP connection has failed!',true);
        $this->logMessage('Attempted to connect to ' . $server . ' for user ' . $ftpUser, true);
        return false;
    } else {
        $this->logMessage('Connected to ' . $server . ', for user ' . $ftpUser);
        $this->loginOk = true;
        return true;
    }
}

下载文件如下:

 public function downloadFile($fileFrom,$fileTo) {
    $asciiArray = array('txt','csv');
    $extension = end(explode('.',$fileFrom));

    if(in_array($extension,$asciiArray)) {
        $mode = FTP_ASCII;
    } else {
        $mode = FTP_BINARY;
    }

    if(ftp_get($this->connectionId,$fileTo,$fileFrom,$mode,0)) {
        $this->logMessage("file " . $fileTo . " successfully downloaded");
        return true;
    } else {
        $this->logMessage("There as an error downloading file " . $fileTo,true);
        return false;
    }
}

我通过 Active Directory 角色管理对我的应用程序的安全访问(这一切都在公司 Intranet 上),但请再次注意,ftp 用户名和密码不依赖于这些角色。

这是我遇到的问题。如果任何服务器管理员尝试获取、保存在我的服务器上并显示,它工作正常。如果某些不是管理员的用户尝试做同样的事情,它可以正常工作,但大多数用户无法完全执行。由于用户必须将文件写入图像文件夹(见上面的路径),我已将该文件夹共享给我需要访问的 Active Directory 角色,并为他们提供对该特定文件夹的读写权限。

返回的错误是:

警告:ftp_get(C:/inetpub/wwwroot/IRIS/images/041351W0006010251F00000064I04.jpg):无法打开流:C:\inetpub\wwwroot\dred\ 中的权限被拒绝ftp_class.php113 行

警告:ftp_get():打开 C:/inetpub/wwwroot/IRIS/images/041351W0006010251F00000064I04 时出错C:\inetpub\wwwroot\dred\ftp_class.php 中的 .jpg 在 113

第 113 行是 ftp_get 所在的行(见上文)。

我在故障排除中尝试了一些方法:

  1. 让 Active Directory 角色管理员写入我的服务器(不是我打算保留的东西,只是在试验):这有效
  2. 授予 Active Directory 角色对服务器 c 驱动器(同样,只是测试)以及 inetpub 和 wwwroot 的完全读/写/更改访问权限:不起作用
  3. ftp_pasv() 设置为 True:无效

我想就是这样!任何建议将不胜感激。

【问题讨论】:

  • 用户是否以某种方式通过 IIS 进行身份验证以访问脚本? IIS 是否可能在远程用户的上下文中运行 PHP?
  • 感谢史蒂夫的评论。我对 IIS 非常缺乏经验,我不确定如何验证您的问题。如果您有任何提示,请告诉我。我应该注意,此应用程序的所有其他 php 对所有用户都适用,这只是我遇到问题的 ftp 序列。
  • 查看this question 并使用 var_dump($_SERVER) 或类似方法查看 PHP 是否以客户端用户身份运行。这可能会影响 IIS 在使用 AD 时允许的权限。
  • 好的,我在 PHP 中调用“downloadFile”的部分插入了 var_dump($_SERVER)(如果我把它放在“downloadFile”中,它就不会执行)。我不确定这是否是正确的地方。无论哪种方式,它都将我的服务器名称作为 USERNAME 返回,将个人网络 ID(即,不是 AD 值)作为 LOGON_USER 和 AUTH_USER 返回。可以访问图像的人和不能访问图像的人都是这种情况。我是否在正确的地方寻找正确的东西?

标签: php ftp


【解决方案1】:

经过数小时的故障排除后,我发现了问题所在。如问题中所述,目标是将图像 FTP 到我本地服务器上的图像文件夹,以便它们可以嵌入到网页中。通过 Windows 文件资源管理器,我试图通过基于 AD 角色共享文件夹来提供对此文件夹的写访问权限。这还不够。

解决此问题的方法是使用系统属性下的安全选项卡,并向 IIS_IUSRS 提供对已定义图像文件夹的写入权限。一旦到位,FTP 进程就可以将图像写入图像文件夹。

【讨论】:

    猜你喜欢
    • 2020-09-29
    • 2017-03-29
    • 2019-11-30
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    • 2021-08-11
    相关资源
    最近更新 更多