我有一个使用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(?),并且确实只是学习经验。
谢谢。
答案 0 :(得分:1)
解决方案:
如果要使用Windows身份验证连接到SQL Server,请删除UID
和PWD
连接选项。使用这些选项时,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 />";
}
?>
说明:
用于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);
?>