【问题标题】:Connecting to SQL Server with sqlsrv_connect using Windows authentication使用 Windows 身份验证通过 sqlsrv_connect 连接到 SQL Server
【发布时间】:2017-06-08 23:10:09
【问题描述】:

使用 Microsoft 的 PHP 驱动程序连接到 SQL Server 的 official guide 看起来很简单,所以我复制了大部分文本:

$server = "serverlocation\prod";
$database = array( "Database"=>"temp");
$conn = sqlsrv_connect($server, $database);

echo "<pre>";

if ( $conn ) {
  echo "Connection established";
} else { 
  echo "Connection could not be established.<br />";
  die( print_r( sqlsrv_errors(), true));
}

当我运行代码时,出现以下错误:

Connection could not be established.
Array
(
    [0] => Array
        (
            [0] => 28000
            [SQLSTATE] => 28000
            [1] => 18456
            [code] => 18456
            [2] => [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Login failed for user '*****DOMAIN\MY_MACHINE_NAME*****'.
            [message] => [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Login failed for user '*****DOMAIN\MY_MACHINE_NAME*****'.
        )

我在错误消息中列出的机器名称上运行此代码,这是一台 Windows 机器,但列出的机器名称不是我登录的用户帐户。我所在的用户帐户登录后拥有此数据库的权限,(我可以使用 MS SQL Server Managment Studio 连接到它就好了......)但是当我尝试使用此脚本进行连接时,它会显示我的机器名称而不是我的用户帐户。

我做错了什么?

【问题讨论】:

  • 我对PHP服务器了解不多。它是您在 IIS 中安装的模块还是独立的?基本上它作为网络服务器帐户运行,而不是你。这里有一点讨论:serverfault.com/questions/105420/…
  • 根据尼克的评论,如果您阅读了问题中链接到的 Microsoft 文档的第一段,它会说“重要的是要注意,在大多数情况下,这意味着 Web 服务器的进程标识或线程身份(如果 Web 服务器使用模拟)用于连接到服务器,不是最终用户的身份。”所以看起来 Web 服务器正在使用机器帐户连接到数据库。

标签: php sql-server


【解决方案1】:

假设您在网络上运行它:

  • 您应该使用 IIS 而不是 Apache
  • IIS 必须启用 Windows 身份验证
  • 必须禁用匿名身份验证
  • 您必须在php.ini 中设置fastcgi.impersonate = 1

假设您登录的帐户已被 SQL Server 识别,您应该可以开始了。完整的讨论请参见this page

在该帖子的 cmets 中,作者建议此 may also be possible with Apache

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 2013-09-07
    • 2014-07-27
    • 2011-04-10
    • 1970-01-01
    相关资源
    最近更新 更多