php - 通过 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(?),实际上只是学习经验。
谢谢你。
解决方案
解决方案:
如果要使用 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 />";
}
?>
说明:
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);
?>
推荐阅读
- javascript - 如何在 Chart.js 3 中更改时间序列图表上的标签和网格线位置?
- c# - 在 .Net 中序列化和反序列化 C# 用户定义的类
- python - discord.py 如何在 API 请求中用 %20 替换空格
- python - 在 for 循环中将一维数组转换为二维
- python - 如何捕获从某个字符串开始并从某行结束然后存储到列表中的字符串
- arrays - 是否可以实现修改声明为不可分配的数组的子例程?
- mysql - 将 phpmyadmin 转移到另一台电脑而不导出
- docker - 带有 docker-windows 执行器的 Gitlab 运行器正在拉取 linux docker 映像并失败
- vue.js - 无法将值道具传递给自定义输入组件
- asp.net - .net core 3.1 / .net core 2.1 上的 HttpWebRequest BeginRead 问题