通过PHP连接时,用户的MS SQL本机客户端登录失败

时间:2018-11-28 18:09:37

标签: php sql-server iis

我有一个使用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));
}

?>

运行此命令时,我收到:

  

连接失败。   数组([0] =>数组([0] => 28000 [SQLSTATE] => 28000 1 => 18456 [code] => 18456 2 => [Microsoft] [SQL Server本机客户端11.0]用户'jaj'的[SQL Server]登录失败。[消息] => [Microsoft] [SQL Server Native Client 11.0]用户'jaj'的登录失败。)1 =>数组([0] => 28000 [SQLSTATE] => 28000 1 => 18456 [code] => 18456 2 => [Microsoft] [SQL Server Native Client 11.0] [SQL Server]登录失败用户'jaj'的登录。[message] => [Microsoft] [SQL Server Native Client 11.0] [SQL Server]用户'jaj'的登录失败。))

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

对于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>

我尝试将其更改为我发现的here,但仍然没有成功。

<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身份验证here的信息,但是启用了Intranet对其进行访问时,它会提示用户输入用户名/密码,甚至可以查看主页。

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

在这里我不是专业人士,只是想从互联网上收集所有信息,使之工作,并希望学到一些东西。

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

谢谢。

1 个答案:

答案 0 :(得分:1)

解决方案:

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

<?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 />";
}
?>

说明:

用于SQL Server的PHP Microsoft驱动程序可以使用Windows Authentication或使用SQL Server Authentication连接到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);
?>