通过PHP连接到SQL Server,使用Windows账户。

6

我正在尝试使用PHP连接到另一台机器上的SQL Server。我找到了两种方法:odbc_connect和sqlsrvr connect。

    $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或0组合使用。
当我直接使用我的用户名和密码时,出现登录被拒绝的错误,当我尝试使用sspi进行Windows身份验证时,会收到以下错误:用户'NT AUTHORITY\ANONYMOUS LOGON'的登录失败。
我已经谷歌了这个问题很多次,但是没有找到解决办法。然而,有些人提到了php不使用Network Service帐户,可能是问题所在。
有没有人知道我该如何解决这个问题,或者给我一些线索?
先感谢您的帮助。

您将使用 PHP 进程(或 Web 服务器进程)正在运行的 UID 进行登录。 - Marc B
有没有办法更改进程运行的用户?我以前没有做过这个,所以我希望能够得到一个“白痴式”的链接。我一直认为在我登录时运行的应用程序是使用我的帐户运行的。 - user1003273
根据您的Web服务器而定,但在更改操作UID时有很多要考虑的事情 - 除非您做得正确,否则完全可能破坏Web服务器。 - Marc B
你有没有可能提供一个链接或者可以让我Google的东西? - user1003273
我最终通过安装IIS6和php解决了问题。我配置了inetmgr以更改默认用于匿名登录的用户。对于其他遇到此问题的人,这是链接:http://learn.iis.net/page.aspx/247/using-fastcgi-to-host-php-applications-on-iis-60/ - user1003273
6个回答

3

我能够使用以下方法从运行在独立IIS服务器上的PHP与远程SQL服务器建立可信连接:

$connectionInfo = array('Database' => $dbname);
$con = sqlsrv_connect($servername,$connectionInfo);

在php.ini文件中:
fastcgi.impersonate = 0
mssql.secure_connection = On

在我的 PHP 网站中使用 IIS:
Anonymous Authentication = Disabled
Windows Authentication = Enabled
Application Pool settings for site: Integrated, Network Service

针对 $dbname 数据库的 SQL Server 数据库安全:

create login: domainname\iisservername$  
map domainname\iisservername$ to db_datareader privilege for $dbname database

注意:iisservername 中的 $ 符号是重要的。使用上述设置,IIS 将与 SQL 服务器建立可信连接,无需在 PHP 文件中存储用户名和密码信息。本地应用程序池使用的权限为“Network Service”。远程情况下,这些权限作为用户 domainname\iisservername$ 通过网络传递。

如何连接到Apache服务器。 - Joyson

2
  1. 打开IIS控制台
  2. 使用所需用户配置您的应用程序池标识,在SQL Server+数据库中必须拥有足够的权限
  3. 选择您的“特定网站”
  4. 打开“身份验证”设置
  5. 右键单击“匿名身份验证”,然后单击“编辑”
  6. 最后选择选项:应用程序池标识(单选按钮),然后按“确定”按钮以应用更改。

这是我的IIS配置方式,并且它正在针对特定的SQL Server实例运行。但是,在该SQL Server实例上,我无法在SQL Server的登录文件夹中看到应用程序池的标识。当我将我的PHP应用程序的连接字符串更新为连接到另一台服务器时,我收到错误消息[Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Login failed for user '{domain}\{username}'。如果在工作的SQL Server的登录文件夹中没有看到该帐户,则不确定如何使此连接与不同的SQL Server正常工作。 - youcantryreachingme

1
对于在IIS 7.5上的PHP,使用SSPI身份验证无需用户名和密码进行连接。我必须执行以下操作:
在我的IIS应用程序池高级设置中,我将其设置为使用自定义帐户Domain\username作为我需要PHP连接的用户。
在我的IIS特定网站中,我将基本设置更改为连接为同一Domain\username。
在我的PHP代码中,我可以使用$conn = sqlsrv_connect($dbhost, array("Database" => $dbname, "UID" => "", "PWD" => ""));进行连接。
其他注意事项:fastcgi.impersonate = 1 并且我只启用了匿名身份验证 *

1

基本上问题在于用于连接服务器的身份将始终是运行PHP的进程的身份。

这个链接可能会对您有所帮助。


嗨。我已经阅读了那篇文章。不幸的是,他提出的解决方案对我没有用。模拟设置没有效果,当尝试使用Windows身份验证连接时,用户始终保持不变。 - user1003273

0
  1. 打开IIS控制台
  2. 进入您的站点
  3. 打开“身份验证”设置 右键单击“匿名身份验证”,然后单击“编辑” 最后选择选项:应用程序池标识(单选按钮),然后按“确定”按钮应用更改。
  4. 转到“应用程序池”并获取应用程序池名称。
  5. 打开SSMS(SQL管理工具),输入相关数据库并选择“安全性”。
  6. 添加新用户,仅填写名称并保存。用户名应为: IIS APPPOOL \ {YOUR_APP_POOL_NAME}

祝好运!


0

您是否尝试过$conn = sqlsrv_connect($serverName);

数组是可选的。默认使用Windows身份验证。请参阅 MSDN文章

IIS应启用Windows身份验证并关闭匿名访问。


是的。同样的错误:登录失败,用户为“NT AUTHORITY\ANONYMOUS LOGON”。 - user1003273
如果是这样,匿名访问将被设置为false,Windows身份验证将被设置为true。 - Colin Edwards
网络服务器目前实际上是我的笔记本电脑。IIS未配置。我还没有使用过它,但我会尝试安装并看看会发生什么。谢谢! - user1003273
是的。这个链接应该会有所帮助。 - Colin Edwards

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接