2012-06-20 52 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