首页 > 解决方案 > 通过 PHP 连接时,用户的 MS SQL Native Client 登录失败

问题描述

我有一个带有 IIS 7.5、MS SQL 2012 Express 的 Windows 2008 R2 数据中心服务器,使用 PHP 5.6 试图通过 Windows 身份验证连接到我创建的数据库 testDB,但我没有这样做。

这是我用来连接到我的 SQL Server\Instance 的 PHP:

<?php

$serverName = "nmc-intranet\intranetsql";
$connectionInfo = array("Database"=>"testDB", "UID"=>"username", "PWD"=>"password");
$conn = sqlsrv_connect( $serverName, $connectionInfo);

if ( $conn ) {
echo "Connection successful.<br />";
} else {
    echo "Connection failed.<br />";
    die( print_r( sqlsrv_errors(), true));
}

?>

当我运行它时,我收到:

连接失败。Array ( [0] => Array ( [0] => 28000 [SQLSTATE] => 28000 1 => 18456 [code] => 18456 2 => [Microsoft][SQL Server Native Client 11.0][SQL Server]登录失败对于用户'jaj'。[消息] => [Microsoft][SQL Server Native Client 11.0][SQL Server]用户'jaj'登录失败。)1 => 数组([0] => 28000 [SQLSTATE] => 28000 1 => 18456 [code] => 18456 2 => [Microsoft][SQL Server Native Client 11.0][SQL Server]用户“jaj”登录失败。[消息] => [Microsoft][SQL Server Native Client 11.0 ][SQL Server]用户“jaj”登录失败。))

在 MS SQL 中,我已将用户名添加到 Security > Logins 并映射 testDB 并提供 dbo 模式。用户还具有 sysadmin 服务器角色。我可以在用户名下通过 CLI 连接到 testDB SQLCMD /S nmc-intranet\intranetSQL /E /d testDB。我还可以通过远程 SSMS 会话连接到 Server\Instance,所以我相信远程连接属性是正确的。我已经验证了此处找到的答案中提到的步骤。

对于 IIS,我尝试了许多不同的方式建立连接,但在那里也没有成功。所以我一直假设我的问题在于 SQL 登录失败错误。我一直在通过 NMC-Intranet 节点和默认网站节点下的 IIS 管理器更改连接字符串,但在那里失败了。我在 web.config 中的当前连接字符串是在 IIS Manger 中进行更改后默认的连接字符串,如下所示:

<connectionStrings>
    <remove name="LocalSqlServer" />
    <add connectionString="Server=nmc-intranet;Database=testDB;Integrated Security=true" name="LocalSqlServer" providerName="System.Data.SqlClient" />
</connectionStrings>

我尝试将其更改为我在此处找到的以下内容,但仍然没有成功。

<connectionStrings>
    <add connectionString="Server=.\SQLEXPRESS;Database=testDB;User ID=username;Password=password" name="LocalSqlServer" providerName="System.Data.SqlClient" />
</connectionStrings>

在 IIS DefaultAppPool 中,我也尝试将 Process Model Identity 更改为用户名/密码。我一直在阅读有关 Kerberos 身份验证的信息,但是当启用它访问 Intranet 时,它会提示用户输入用户名/密码以查看主页。

我希望我正确地问了这个问题,因为以前的问题没有受到欢迎。我做了很多研究,但我不知道我可能会错过什么,我做了很多更改并恢复它们,因为它们不起作用我只是希望我接下来可能需要尝试一些方向。我很可能误解了某些内容,因为我对如何建立连接没有完全了解,并且跳过了一个步骤或忽略了一些信息。

我在这里不是专业人士,只是想从互联网上收集所有内容,使其发挥作用,并希望能学到一些东西。

结束游戏我希望用户通过 AD 登录到 Intranet,并上传文件,创建自己的帖子,创建可以通过 Intranet 管理的各种目录,可能有一个 IM(?),实际上只是学习经验。

谢谢你。

标签: phpsql-serveriissqlsrv

解决方案


解决方案:

如果要使用 Windows 身份验证连接到 SQL Server,请删除UIDPWD连接选项。当您使用这些选项时,PHP 驱动程序会尝试使用 SQL Server 身份验证进行连接(我猜这jaj是 的值UID)。

<?php
$serverName = "nmc-intranet\intranetsql";
$connectionInfo = array(
    "Database"=>"testDB"
);
$conn = sqlsrv_connect($serverName, $connectionInfo);

if ($conn === false) {
    echo "Connection failed.<br />";
    die( print_r( sqlsrv_errors(), true));
} else {
    echo "Connection successful.<br />";
}
?>

说明:

Microsoft Drivers for PHP for SQL Server 可以使用Windows 身份验证SQL Server 身份验证连接到 SQL Server 。当您使用 Windows 身份验证时,Web 服务器的进程标识或线程标识(如果 Web 服务器使用模拟)用于连接到服务器,而不是最终用户的标识。我使用这个脚本来获取更多信息:

<?php
# ---------------------------------------
# SQL Server authentication
# ---------------------------------------
echo "SQL Server authentication"."</br>";
$server = 'server\instance,port';
$cinfo = array(
    "Database"=>'master',
    "UID"=>'login',
    "PWD"=>'password'
);
$conn = sqlsrv_connect($server, $cinfo);
if( $conn === false )
{
    echo "Error (sqlsrv_connect): ".print_r(sqlsrv_errors(), true);
    exit;
}
$sql = 
    "SELECT 'SUSER_SNAME' AS [NAME], CONVERT(nvarchar(128), SUSER_SNAME()) AS [VALUE]".
    "UNION ALL ".
    "SELECT 'SUSER_NAME' AS [NAME], CONVERT(nvarchar(128), SUSER_NAME()) AS [VALUE]".
    "UNION ALL ".
    "SELECT 'USER_NAME' AS [NAME], CONVERT(nvarchar(128), USER_NAME()) AS [VALUE]".
    "UNION ALL ".
    "SELECT 'USER_ID' AS [NAME], CONVERT(nvarchar(128), USER_ID()) AS [VALUE]";
$stmt = sqlsrv_query($conn, $sql);
if( $stmt === false ) {
    echo "Error (sqlsrv_query): ".print_r(sqlsrv_errors(), true);
    exit;
}
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
    echo $row['NAME'].": ".$row['VALUE']."</br>";
}
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);


# ---------------------------------------
# Windows authentication
# ---------------------------------------
echo "Windows authentication"."</br>";
$server = 'server\instance,port';
$cinfo = array(
    "Database"=>'master'
);
$conn = sqlsrv_connect($server, $cinfo);
if( $conn === false )
{
    echo "Error (sqlsrv_connect): ".print_r(sqlsrv_errors(), true);
    exit;
}
$sql = 
    "SELECT 'SUSER_SNAME' AS [NAME], CONVERT(nvarchar(128), SUSER_SNAME()) AS [VALUE]".
    "UNION ALL ".
    "SELECT 'SUSER_NAME' AS [NAME], CONVERT(nvarchar(128), SUSER_NAME()) AS [VALUE]".
    "UNION ALL ".
    "SELECT 'USER_NAME' AS [NAME], CONVERT(nvarchar(128), USER_NAME()) AS [VALUE]".
    "UNION ALL ".
    "SELECT 'USER_ID' AS [NAME], CONVERT(nvarchar(128), USER_ID()) AS [VALUE]";
$stmt = sqlsrv_query($conn, $sql);
if( $stmt === false ) {
    echo "Error (sqlsrv_query): ".print_r(sqlsrv_errors(), true);
    exit;
}
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
    echo $row['NAME'].": ".$row['VALUE']."</br>";
}
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
?>

推荐阅读