无法使用PHP从IIS web服务器使用服务帐户连接到SQL 2019

无法使用PHP从IIS web服务器使用服务帐户连接到SQL 2019,php,sql-server,iis,pdo,windows-server,Php,Sql Server,Iis,Pdo,Windows Server,我有一个PHP应用程序运行在Windows服务器2019 IIS上(我认为它是IIS 8.5)。我们很快就要将数据库设置从带有SQL帐户的SQL 2012更改为带有Windows服务帐户的SQL 2019,我在连接到该设置时遇到了问题 我的问题是我得到了这个错误: SQLSTATE[28000]: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Login failed for user 'mydomain\myuser'. 我已将所

我有一个PHP应用程序运行在Windows服务器2019 IIS上(我认为它是IIS 8.5)。我们很快就要将数据库设置从带有SQL帐户的SQL 2012更改为带有Windows服务帐户的SQL 2019,我在连接到该设置时遇到了问题

我的问题是我得到了这个错误:

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
我已经与进行了双重检查,所有内容似乎都是正确的,并且我正在使用受支持的版本,我确实是

我正在使用以下PHP代码进行连接:

$sqlSrv = "fqdn.for.my.server";
$sqlUsr = "mydomain\\myuser";
$sqlPsw = "mysecretpassword";
$sqlDb = "MyDatabase";

try {
    $pdoRdmdb = new PDO(
        "sqlsrv:Server=$sqlSrv;Database=$sqlDb",
        $sqlUsr,
        $sqlPsw
    );
    $pdoRdmdb->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
    exit($e->getMessage());
}
我还尝试了另一种使用常规SQL而不是PDO的方法:

$conn = array(
    "UID" => $sqlUsr,
    "PWD" => $sqlPsw,
    "Database" => $sqlDb,
    "Encrypt" => true,
    "TrustServerCertificate" => true,
    "LoginTimeout" => 30,
);

$sql = sqlsrv_connect($sqlSrv, $conn);
if(!$sql) {
    exit(print_r(sqlsrv_errors()));
}
。。但也有同样的错误。完全相同的代码适用于SQL 2012数据库(不同的用户)

有趣的是,如果我执行
RunAs
命令,我可以(从我的web服务器)使用相同的
myuser
帐户通过SQL Management Studio连接到SQL 2019数据库:

runas.exe /USER:mydomain\myuser /netonly "C:\Program Files (x86)\Microsoft SQL Server Management Studio 18\Common7\IDE\Ssms.exe"
此外,如果我使用SQL帐户连接,我还可以连接到SQL 2019数据库-然后一切正常,但遗憾的是,这不是我的选项:-/


如果这是我连接的Windows服务帐户,我不知道我是否需要在PHP代码中执行任何特殊操作?是否有人遇到过类似问题?

对数据库的身份验证应通过IIS处理。这意味着应该使用新的服务帐户用户设置应用程序池,然后PHP数据库连接应该不包含任何凭据

对于PHP数据库连接字符串,如下所示:

$conn = array(
    "Database" => $sqlDb,
    "Encrypt" => true,
    "TrustServerCertificate" => true,
    "LoginTimeout" => 30,
);
请注意,不再包括
UID
PWD

在IIS中,您应该创建一个新的应用程序池,并将服务帐户与其关联。然后在IIS中要使用此服务帐户进行身份验证的文件夹上,单击“转换为应用程序”,并应为其选择新创建的应用程序池。确保服务帐户可以访问web文件夹中的文件


这至少对我有用:-)

对数据库的身份验证应该通过IIS处理。这意味着应该使用新的服务帐户用户设置应用程序池,然后PHP数据库连接应该不包含任何凭据

对于PHP数据库连接字符串,如下所示:

$conn = array(
    "Database" => $sqlDb,
    "Encrypt" => true,
    "TrustServerCertificate" => true,
    "LoginTimeout" => 30,
);
请注意,不再包括
UID
PWD

在IIS中,您应该创建一个新的应用程序池,并将服务帐户与其关联。然后在IIS中要使用此服务帐户进行身份验证的文件夹上,单击“转换为应用程序”,并应为其选择新创建的应用程序池。确保服务帐户可以访问web文件夹中的文件


这至少对我有效:-)

类似。请检查SQL Server错误日志以获取可能包含有关登录失败原因的更多详细信息的相关消息。类似。请检查SQL Server错误日志以获取可能包含有关登录失败原因的更多详细信息的相关消息。