要穿過防火牆連上一台SQL(1433 Port有開,網路芳鄰NETBIOS封閉),發現用SQL帳號登入(SQL Authentication)可成功登入,若用AD帳號(Windows Authentication)則會出錯。

錯誤訊息為:

已超過連接逾時的設定。在嘗試使用登入前的信號交換確認時超過逾時等待的時間。這可能是登入前的信號交換發生失敗,或伺服器無法及時回應所造成。

Connection Timeout Expired. The timeout period elapsed while attempting to consume the pre-login handshake acknowledgement. This could be because the pre-login handshake failed or the server was unable to respond back in time.

 

爬文找到線索,有人回報ADO.NET連線字串使用Integrated Security=SSPI時發生相同狀況,但較常原因是SQL Server的Named Pipe或TCP/IP協定未啟動所致,與我受防火牆阻隔的情境不同。心生一計,Server Name用機器名稱取代IP,就登入成功了。推測使用Windows Authentication需由IP解析機器名稱,但因防火牆阻擋無法反查,故造成操作逾時,直接輸入機器名稱避開此一無法完成的程序。以上僅限揣測,還是PO文一篇備忘,順便供給遇到這些罕見情境的有緣人參考。

【2016-03-18 補充】

文章貼出後,於FB獲網友高錦川先生提供MSKB一則,文中提到:

當用戶端的 SQL Server 驅動程式使用整合式安全性連線至 SQL Server,用戶端驅動程式的程式碼會嘗試解析執行 SQL Server 電腦的完整格式 DNS 網域名稱,方法是使用 WinSock 網路 API。為了執行這項作業,驅動程式的程式碼會呼叫 gethostbyname 及 gethostbyaddr WinSock API。即使 IP 位址或主機名稱通過執行 SQL Server 的電腦驗證,如果該電腦使用整合式安全性,SQL Server 驅動程式仍然會嘗試解析連線電腦的 DNS 完整格式。

算是證實使用Windows驗證(整合式安全性)會觸發由IP反查機器名稱的動作,由於出問題的主機身處防火牆內無法用NETBIOS反查機器,再因DNS設定問題從IP反查FQDN也失敗,造成以上的結果。依此原理,在hosts中設定SQL的IP與機器對應後,用IP也能用AD帳號登入了。

KB提供一招檢測技巧,使用「ping –a xxx.xxx.xxx.xxx」檢查解析名稱是否成功,例如以下例子,192.168.32.11解析失敗,192.168.32.12則成功解析為sqlserver01,結果為用AD帳號可登入192.168.32.12,登入192.168.32.11則會失敗。

C:\Windows\System32\drivers\etc>ping -a 192.168.32.11

Ping 192.168.32.11 (使用 32 位元組的資料):
回覆自 192.168.32.11: 位元組=32 時間=3ms TTL=116
回覆自 192.168.32.11: 位元組=32 時間=3ms TTL=116
回覆自 192.168.32.11: 位元組=32 時間=3ms TTL=116
回覆自 192.168.32.11: 位元組=32 時間=3ms TTL=116

192.168.32.11 的 Ping 統計資料:
    封包: 已傳送 = 4,已收到 = 4, 已遺失 = 0 (0% 遺失),
大約的來回時間 (毫秒):
    最小值 = 3ms,最大值 = 3ms,平均 = 3ms

C:\Windows\System32\drivers\etc>ping -a 192.168.32.12

Ping sqlserver01 [192.168.32.12] (使用 32 位元組的資料):
回覆自 192.168.32.12: 位元組=32 時間=2ms TTL=116
回覆自 192.168.32.12: 位元組=32 時間=2ms TTL=116
回覆自 192.168.32.12: 位元組=32 時間=2ms TTL=116
回覆自 192.168.32.12: 位元組=32 時間=2ms TTL=116

192.168.32.12 的 Ping 統計資料:
    封包: 已傳送 = 4,已收到 = 4, 已遺失 = 0 (0% 遺失),
大約的來回時間 (毫秒):
    最小值 = 2ms,最大值 = 2ms,平均 = 2ms

學會這招,下回再遇SQL帳號可登,AD帳號無法登入的狀況,可以先用「ping -a」技巧初步偵斷一下。


Comments

# by Alextamly

不負責任的問問………是否和AD同一台機?不是的話…時間是否一致?

# by Jeffrey

to Alextamly, 依據「改用機器名稱後就可登入」這點,我認為因時間不準或無法連線AD Server導致登入失敗的可能性不高。

Post a comment