我有一个带有 IIS 7.5、MS SQL 2012 Express 的 Windows 2008 R2 数据中心服务器,使用 PHP 5.6 尝试连接到我创建的数据库 testDB,通过 Windows 身份验证,但我没有这样做。
这是我用来连接到我的 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”。[message] => [Microsoft][SQL Server Native Client 11.0][SQL Server]用户“jaj”登录失败。) 1 => Array ( [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 中,我已将用户名添加到 Security > Logins 并映射 testDB 并提供了 dbo 架构。用户还具有 sysadmin 服务器角色。我可以SQLCMD /S nmc-intranet\intranetSQL /E /d testDB
在用户名下通过 CLI 连接到 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 中,我也尝试将进程模型标识更改为用户名/密码。我一直在这里阅读有关 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);
?>
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句