无法使用 PHP 从 IIS Web 服务器使用服务帐户连接到 SQL 2019
Cannot connect to SQL 2019 with service account from IIS web server with PHP
我在 Windows Server 2019 IIS(我认为是 IIS 8.5)上有一个 PHP 应用程序 运行。我们很快就会将我们的数据库设置从 SQL 2012 与本地 SQL 帐户更改为 SQL 2019 与 Windows 服务帐户,我确实有连接问题设置。
我的问题是出现此错误:
SQLSTATE[28000]: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Login failed for user 'mydomain\myuser'.
我已将所有内容更新到最新的稳定版本:
- PHP 是
7.4.11
- PHP
pdo_sqlsrv
版本为 5.8.0+12928
- PHP
sqlsrv
版本为 5.8.0+12928
- Windows ODBC 版本
17.6
我已经用 System Requirements for the Microsoft Drivers for PHP for SQL Server and Microsoft PHP Drivers for SQL Server Support Matrix 仔细检查过一切似乎都是正确的并且我使用的是受支持的版本 - 我是。
我正在连接这个 PHP (PDO) 代码:
try {
$pdo = new PDO(
"sqlsrv:Server='fqdn.myserver';Database='MyDatabase'",
"mydomain\myuser",
"mysecretpassword"
);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
exit($e->getMessage());
}
我还尝试了另一种使用常规 SQL 而不是 PDO 的方法:
$conn = array(
"UID" => "mydomain\myuser",
"PWD" => "mysecretpassword",
"Database" => "MyDatabase",
"Encrypt" => true,
"TrustServerCertificate" => true,
"LoginTimeout" => 30,
);
$sql = sqlsrv_connect("fqdn.myserver", $conn);
if(!$sql) {
exit(print_r(sqlsrv_errors()));
}
..但有同样的错误。完全相同的代码适用于 SQL 2012 数据库(不同用户)。
有趣的是,如果我执行RunAs
命令:
runas.exe /USER:mydomain\myuser /netonly "path_to_MSSQLSrvMgmtStudio\Ssms.exe"
如果我使用 SQL 帐户连接,我还可以连接到 SQL 2019 数据库 - 那么一切正常,但遗憾的是,这对我来说不是一个选项:-/
如果这是我连接的Windows服务帐户,我不知道是否需要在我的PHP代码中做任何特殊的事情?有没有人遇到过类似的问题?
使用 Active Directory 服务帐户时,应通过 IIS 处理对数据库的身份验证。这意味着应该使用新的服务帐户用户设置 IIS“应用程序池”,然后 PHP 数据库连接应该 不 包含任何凭据。
所以它实际上应该与上面的 PDO 连接字符串相同,只是它应该排除 username/password 部分。它应该看起来像这样::
try {
$pdo = new PDO(
"sqlsrv:Server='fqdn.myserver';Database='MyDatabase'"
);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
exit($e->getMessage());
}
在 IIS 中,您应该创建一个新的 Application Pool 条目并将服务帐户与其相关联。然后在 IIS 中的文件夹上,您要使用此服务帐户进行身份验证,然后单击 转换为应用程序 ,您应该 select 为其新创建的应用程序池。确保服务帐户可以访问 web 文件夹中的文件。
您还可以在默认分配的应用程序池上使用服务帐户。
这至少对我有用:-)
我在 Windows Server 2019 IIS(我认为是 IIS 8.5)上有一个 PHP 应用程序 运行。我们很快就会将我们的数据库设置从 SQL 2012 与本地 SQL 帐户更改为 SQL 2019 与 Windows 服务帐户,我确实有连接问题设置。
我的问题是出现此错误:
SQLSTATE[28000]: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Login failed for user 'mydomain\myuser'.
我已将所有内容更新到最新的稳定版本:
- PHP 是
7.4.11
- PHP
pdo_sqlsrv
版本为5.8.0+12928
- PHP
sqlsrv
版本为5.8.0+12928
- Windows ODBC 版本
17.6
我已经用 System Requirements for the Microsoft Drivers for PHP for SQL Server and Microsoft PHP Drivers for SQL Server Support Matrix 仔细检查过一切似乎都是正确的并且我使用的是受支持的版本 - 我是。
我正在连接这个 PHP (PDO) 代码:
try {
$pdo = new PDO(
"sqlsrv:Server='fqdn.myserver';Database='MyDatabase'",
"mydomain\myuser",
"mysecretpassword"
);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
exit($e->getMessage());
}
我还尝试了另一种使用常规 SQL 而不是 PDO 的方法:
$conn = array(
"UID" => "mydomain\myuser",
"PWD" => "mysecretpassword",
"Database" => "MyDatabase",
"Encrypt" => true,
"TrustServerCertificate" => true,
"LoginTimeout" => 30,
);
$sql = sqlsrv_connect("fqdn.myserver", $conn);
if(!$sql) {
exit(print_r(sqlsrv_errors()));
}
..但有同样的错误。完全相同的代码适用于 SQL 2012 数据库(不同用户)。
有趣的是,如果我执行RunAs
命令:
runas.exe /USER:mydomain\myuser /netonly "path_to_MSSQLSrvMgmtStudio\Ssms.exe"
如果我使用 SQL 帐户连接,我还可以连接到 SQL 2019 数据库 - 那么一切正常,但遗憾的是,这对我来说不是一个选项:-/
如果这是我连接的Windows服务帐户,我不知道是否需要在我的PHP代码中做任何特殊的事情?有没有人遇到过类似的问题?
使用 Active Directory 服务帐户时,应通过 IIS 处理对数据库的身份验证。这意味着应该使用新的服务帐户用户设置 IIS“应用程序池”,然后 PHP 数据库连接应该 不 包含任何凭据。
所以它实际上应该与上面的 PDO 连接字符串相同,只是它应该排除 username/password 部分。它应该看起来像这样::
try {
$pdo = new PDO(
"sqlsrv:Server='fqdn.myserver';Database='MyDatabase'"
);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
exit($e->getMessage());
}
在 IIS 中,您应该创建一个新的 Application Pool 条目并将服务帐户与其相关联。然后在 IIS 中的文件夹上,您要使用此服务帐户进行身份验证,然后单击 转换为应用程序 ,您应该 select 为其新创建的应用程序池。确保服务帐户可以访问 web 文件夹中的文件。
您还可以在默认分配的应用程序池上使用服务帐户。
这至少对我有用:-)