我正在尝试使用 PHP 连接到另一台计算机上的 SQL Server。我找到了两种方法来做到这一点。使用 odbc_connect 或 sqlsrvr 连接。
$connection = odbc_connect("Driver={SQL Server Native Client 10.0};Server=$serverName;Database=$db;", 'user', 'pass');
或
$conn = sqlsrv_connect($serverName, array('UID' => '', 'PWD' => ''));
如果我尝试连接到 SQL 帐户,连接就会正常。不幸的是,我无法使用 Windows 身份验证进行连接。
到目前为止,我已经尝试过以下操作:使用工作通行证,添加
Trusted_Connection=yes;
或Integrated Security=SSPI;
。我也尝试过将其与fastcgi.impersonate = 1 or 0
结合起来。
当我直接使用我的用户并通过时,我收到登录被拒绝错误,当我尝试使用 SSPI 进行 Windows 身份验证时,我收到以下消息:
错误:用户“NT AUTHORITY\ANONYMOUS LOGON”登录失败。
然而,有些人正在谈论 PHP 不使用网络服务帐户,这可能就是问题所在。
有人知道我该如何解决这个问题或者给我指导吗?
提前谢谢您。
我能够使用在单独的 IIS 服务器上运行的 PHP 建立到远程 SQL 服务器的可信连接:
$connectionInfo = array('Database' => $dbname);
$con = sqlsrv_connect($servername,$connectionInfo);
在 php.ini 中:
fastcgi.impersonate = 0
mssql.secure_connection = On
在 IIS 中我的 PHP 站点:
Anonymous Authentication = Disabled
Windows Authentication = Enabled
Application Pool settings for site: Integrated, Network Service
SQL Server 上 $dbname 数据库的数据库安全性:
create login: domainname\iisservername$
map domainname\iisservername$ to db_datareader privilege for $dbname database
注意:iisservername 中的 $ 很重要。通过上述设置,IIS 将与 SQL Server 建立可信连接,而无需在 PHP 文件中存储用户 ID 和密码信息。本地应用程序池使用的权限是“网络服务”。在远程,这些权限作为用户域名\iisservername$ 通过网络传递。
基本上问题在于,用于连接到服务器的身份始终是运行 PHP 的进程的身份
这个链接可能对您有帮助。
对于 IIS 7.5 上的 PHP,无需用户名和密码即可使用 SSPI 身份验证进行连接。我必须执行以下操作:
在我的 IIS 应用程序池高级设置中,我将其设置为使用自定义帐户“域\用户名”作为我需要 PHP 连接的用户。
在我的 IIS 特定网站中,我将基本设置更改为以同一域\用户名连接。
在我的 PHP 代码中,我可以使用
$conn = sqlsrv_connect($dbhost, array("Database" => $dbname, "UID" => "", "PWD" => ""));
进行连接
其他注意事项:
fastcgi.impersonate = 1
我只有:启用匿名身份验证
*
你尝试过吗
$conn = sqlsrv_connect($serverName);
数组是可选的。默认使用 Windows 身份验证。请参阅这篇 MSDN 文章
IIS 应启用 Windows 身份验证并关闭匿名访问。
祝你好运!