2012-06-20 30 views
2

我正在尝试使用PHP连接到Microsoft SQL Server数据库(在IIS中)。代码中提供的用户/密码是一个AD帐户,可以通过Access中的ODBC访问数据库。如何在PHP中使用NT身份验证连接?

$serverName = "servername"; 
$connectionInfo = array("Database"=>"dbname", "UID"=>"myuser", "PWD"=>"mypass"); 
$conn = sqlsrv_connect($serverName, $connectionInfo); 

if($conn) { 
    echo "Connection established.<br />"; 
}else{ 
    echo "Connection could not be established.<br /><pre>"; 
    die(print_r(sqlsrv_errors(), true)); 
} 

用户名和密码与服务器名称和数据库名称一样有效。但是,这是返回错误:

[Microsoft][SQL Server Native Client 10.0][SQL Server]Login failed for user 'myuser'.

对于用户名(这是AD的有效用户,我可以连接/链接到该数据库采用Access)我也试过:

我的域用户(myuser)具有管理员通过AD向该服务器授予特权。但是,返回相同的Login failed错误。有什么我失踪?我可以使用Access连接到相同的数据库,而不会出现问题(在同一用户下)。

我在Access中连接的方式是本地用户的ODBC数据源。数据源设置为“使用网络登录ID进行Windows NT身份验证”进行身份验证。我怎么能在PHP中做到这一点?

this impersonation configuration可能的原因?

PHP的用户nt authority\iusr

下运行。如果有人尝试使用iusr不会错误消息相告登录?

我已经试过这台名为“TestDS”关于创建数据源,并使用代码:

$conn = odbc_connect("TestDS", "", ""); 

但是,这给了我:

The specified DSN contains an architecture mismatch between the Driver and Application, SQL state IM014 in SQLConnect

MACHINE1是一个客户端试图访问一个网页(其中PHP代码位于Machine2上),Machine2上的代码正在将Machine3连接到SQL连接(servername)。

回答

2

通过在连接字符串中指定“Trusted Connection = SSPI”来启用SQL Server连接中的“Windows安全性”。没有用户名或密码存储在连接字符串中(仅用于“SQL Server安全性”)。运行PHP的进程(可能是php_cgi.exe本身)必须在Windows(在本地或AD)下运行,该Windows在SQL Server上注册了Windows登录名。

在IIS下php_cgi.exe在应用程序池的用户身份下运行。如果你有一个异构的安全环境,我建议为这个单独的网站创建一个IIS应用程序池。

+0

我编辑了我的问题。所以我应该添加一个本地用户'iusr'到SQL服务器上? – JBurace

+0

是的,但在连接字符串中使用“可信连接”选项而不是用户名/密码。请注意,如果您的SQL Server位于不同的物理机器上(并且机器之间没有Active Directory信任关系),那么您将不得不使用SQL Server身份验证而不是Windows身份验证。 – Dai

+0

我用SQL身份验证去了。 – JBurace

相关问题