修正︰ 您收到 「 無法產生 SSPI 內容 」 錯誤訊息當您嘗試連線到 SQL Server 2000 SP3 伺服器電腦


摘要


當您嘗試從用戶端電腦連線到 Microsoft SQL Server 2000 Service Pack 3 (SP3) 伺服器電腦時,如果無法解析伺服器名稱,從網際網路通訊協定 (IP) 位址連線會失敗並出現錯誤訊息。之所以發生這個問題,是因為 SQLOLEDB 不正確地解譯 dbnetlib 的 ConnectionGetSvrUser 函式的傳回值。
  • Hotfix 解決了這個問題。
  • 若要解決這個問題,請在用戶端電腦中手動建立的 IP 位址的主機項目。
  • 如果要重現問題,建立動態的 IP 位址的伺服器電腦,並設定然後使用 SQL 查詢分析器 」 或 「 資料列集檢視器,從用戶端電腦連線到伺服器電腦。

狀況


當您嘗試連線到 Microsoft SQL Server 2000 SP3 伺服器電腦的用戶端電腦時,伺服器名稱無法解析網際網路通訊協定 (IP) 的地址,但卻連線。

當您連線到 SQL Server 2000 SP3 伺服器電腦上使用 SQL 查詢解析程式時,您會收到下列錯誤訊息︰
伺服器︰ 訊息 11004,層次 16,狀態 1
[Microsoft][ODBC SQL Server Driver]無法產生 SSPI 內容
當您使用 SQL Server OLE DB 提供者 (SQLOLEDB) 來使用資料列集檢視器連線至 SQL Server 2000年的伺服器電腦時,您會收到下列錯誤訊息︰
來源: 「 Microsoft OLE DB 提供者的 SQL Server 」

介面︰ IID_IDBInitialize
結果︰ 0x80004005 = E_FAIL

ISQLErrorInfo: [HY000] [0x00002afc]
IErrorInfo: [0x00002afc] 「 無法產生 SSPI 內容 」

檔案︰ D:\MDACTools\rowsetviewer\CBase.cpp
行︰ 1067年

原因


當 SQLOLEDB 呼叫 dbnetlib 程式庫的ConnectionGetSvrUser函式時,它不正確解譯,這個函式會傳回布林值。ConnectionGetSvrUser函式被設計來傳回 void。因此,任何位於 EAX 登錄變成傳回的值。


ConnectionGetSvrUser函式內部呼叫gethostbyaddr函式。Gethostbyaddr函式會取得對應到特定的 IP 位址的主機名稱。如果gethostbyaddr函式失敗,則會傳回零字元,以 EAX 登錄。因此, ConnectionGetSvrUser函數會傳回FALSE值。這個行為會造成 SQL Server 2000 SP3 伺服器電腦的登入失敗。


解決方案


支援的 hotfix 可從 Microsoft 取得。不過,此 Hotfix 僅用於修正本文中所述的問題。此 Hotfix 只適用於發生此特定問題的系統上。

如果 hotfix 可供下載,在此知識庫文件頂端將出現「可用的 Hotfix」區段。如果這個區段不會出現,將要求提交給 Microsoft 客戶服務及支援取得 Hotfix。

注意如果發生其他問題,或如果需要進行疑難排解,您可能必須建立個別的服務要求。收取支援費用會套用到其他支援問題和此特定 hotfix 無法解決的問題。如 Microsoft 客戶服務及支援的電話號碼或建立個別的服務要求的完整清單,請造訪下列 Microsoft 網站︰注意「 下載 Hotfix 」 表單會顯示 hotfix 可用的語言。如果看不到您的語言,是因為未提供該語言的 Hotfix 。此 hotfix的英文版本具有的檔案屬性 (或更新) 下表中所列。國際標準時間 (UTC) 中,所列的日期和時間,這些檔案。當您檢視檔案資訊時,會將它轉換為本地時間。若要想知道 UTC 及當地時間的時差,使用 [控制台] 中的 [日期和時間] 工具中的 [時區] 索引標籤。

Date Time Version Size File name
--------------------------------------------------------------

15-Jun-2004 00:22 2000.85.1045.0 28,672 Dbnmpntw.dll
15-Jun-2004 00:21 2.80.1045.0 147,456 Msadds.dll
15-Jun-2004 00:21 2.80.1045.0 512,000 Msado15.dll
15-Jun-2004 00:21 2.80.1045.0 163,840 Msadomd.dll
15-Jun-2004 00:21 2.80.1045.0 184,320 Msadox.dll
15-Jun-2004 00:21 2.80.1045.0 53,248 Msadrh15.dll
15-Jun-2004 00:21 2.80.1045.0 225,280 Msdaora.dll
15-Jun-2004 00:21 2.80.1045.0 147,456 Msdart.dll
15-Jun-2004 00:21 2.575.1045.0 139,264 Msorcl32.dll
15-Jun-2004 00:21 3.525.1045.0 221,184 Odbc32.dll
15-Jun-2004 00:22 2000.85.1045.0 24,576 Odbcbcp.dll
15-Jun-2004 00:21 2.80.1045.0 442,368 Oledb32.dll
15-Jun-2004 00:21 2000.85.1045.0 503,808 Sqloledb.dll
15-Jun-2004 00:21 2000.85.1045.0 401,408 Sqlsrv32.dll
15-Jun-2004 00:08 2000.85.1045.0 208,896 Sqlxmlx.dll

因應措施


若要解決這個問題,請在您想要連線的 IP 位址的用戶端電腦上手動建立主機項目。
  1. 啟動 Windows 檔案總管。
  2. 找出 Hosts 檔案,並接著在 「 記事本 」 中開啟檔案。

    注意您可以在 %SystemRoot%\System32\Drivers\Etc 路徑中尋找的檔案。
  3. 在檔案結尾處加入下列︰
    隨機 IP電腦名稱

    注意隨機 IP是 IP 位址不在網路中的另一台電腦的使用中的預留位置。電腦名稱是電腦的發生在它上面執行的 SQL Server 2000 SP3 名稱的預留位置。隨機的 IP位址和電腦名稱名稱必須是至少一個空格隔開。
  4. 按一下 [檔案] 功能表的 [儲存]。
  5. 關閉檔案。

狀態


Microsoft 已確認這是<套用>一節所列出的 Microsoft 產品的問題。

更多的資訊


如果要重現問題的步驟

設定動態 IP 位址

  1. 正在執行 SQL Server 2000 SP3 的電腦系統管理員身分登入。
  2. 在控制台中,按兩下 [網路連線]。
  3. 連按兩下您想要修改的本機區域連線。
  4. 在 [區域連線狀態] 對話方塊中,按一下 [內容]。[區域連線內容] 對話方塊隨即出現。
  5. 這個連線使用下列項目] 方塊中,按一下 [網際網路通訊協定 (TCP/IP)],然後按一下內容網際網路通訊協定 (TCP/IP) 內容] 對話方塊隨即出現。
  6. 按一下 [自動取得 IP 位址],然後按一下[確定]
  7. 在 [區域連線內容] 對話方塊中,按一下 [關閉]。

  8. 在 [區域連線狀態] 對話方塊中,按一下 [關閉]。
  9. 按一下 [開始],按一下 [執行]、 輸入cmd,然後按一下[確定]
  10. 在命令提示字元中,輸入電腦名稱ping,,,然後按 ENTER 鍵。

    注意電腦名稱是電腦的執行的 SQL Server 2003年名稱的預留位置

    您會收到類似下列的錯誤訊息︰
    抓取電腦名稱[動態 IP] 與 [32 位元組的資料︰

    動態 IP的回覆︰ 位元組 = 32 時間 < 1ms TTL = 128
    動態 IP的回覆︰ 位元組 = 32 時間 < 1ms TTL = 128
    動態 IP的回覆︰ 位元組 = 32 時間 < 1ms TTL = 128

    動態 IP的 Ping 統計資料︰
    封包: 傳送 = 4,接收 = 4,失物 = 0 (0%遺失),
    大約往返時間,以毫秒︰
    最小值 = 0ms,最大值 = 0ms,平均 = 0ms
    注意動態 IP是動態的電腦名稱的電腦 IP 的預留位置。
  11. 若要結束命令提示字元,請輸入結束,,然後按 ENTER 鍵。
  12. 重複步驟 c 到 e 按一下 [使用下列的 IP 位址
  13. 在 [ IP 位址] 方塊中,輸入的動態 IP位址。

    注意動態 IP是動態的電腦名稱的電腦 IP 的預留位置。
  14. 在 [子網路遮罩] 方塊中,輸入您的網路的子網路遮罩。
  15. 在 [預設閘道] 方塊中,輸入電腦或裝置的 IP 位址在您將網路連線到另一個網路或網際網路的網路上。
  16. 在 [慣用 DNS 伺服器] 方塊中,輸入主機名稱解析為 IP 位址的電腦的 IP 位址。
  17. 在 [其他 DNS 伺服器] 方塊中,鍵入您想要使用如果慣用的 DNS (網域名稱系統) 伺服器變成不可使用的 DNS 電腦的 IP 位址。
  18. 按一下 [進階]。此時會出現 [進階 TCP/IP 設定
  19. IP 位址] 之下按一下 [新增]。TCP/IP 位址] 對話方塊隨即出現。
  20. 在 [ IP 位址] 方塊中,輸入隨機的 IP位址。

    注意隨機 IP是 IP 位址不在網路中的另一台電腦的使用中的預留位置。
  21. 在 [子網路遮罩] 方塊中,輸入您的網路的子網路遮罩,然後按一下 [新增
  22. 進階 TCP/IP 設定中,按一下[確定]
  23. 在 [網際網路通訊協定 (TCP/IP) 內容中,按一下[確定]。在 [區域連線內容] 對話方塊中,按一下 [關閉]。在 [區域連線狀態] 對話方塊中,按一下 [關閉]。

從 SQL 查詢分析器透過用戶端電腦連線到 SQL Server 2000 SP3 伺服器電腦

  1. 啟動 SQL 查詢分析器。連線到 SQL Server ] 對話方塊隨即出現。
  2. SQL Server ] 方塊中,鍵入隨機 IP

    注意隨機 IP是 IP 位址不在網路中的另一台電腦的使用中的預留位置。
  3. 在 [使用連線,按一下 [ Windows 驗證]。
  4. 按一下 [確定]。您會發現 < 徵狀=""> 一節所述的錯誤訊息。

連線到 SQL Server 2000 SP3 伺服器電腦上,從用戶端電腦,透過資料列集檢視器

  1. 啟動資料列集檢視器。Microsoft OLE DB RowsetViewer視窗隨即出現。
  2. 按一下 [檔案] 功能表上的 [完整的連線]。以完整連線-沒有描述可用的對話方塊隨即出現。
  3. 提供者] 清單中,按一下 [連接] 下方的 [ SQLOLEDB ]。
  4. 在 [資料來源] 方塊中,輸入在 [來源] 下的隨機 IP

    注意隨機 IP是 IP 位址不在網路中的另一台電腦的使用中的預留位置。
  5. 在 [登入,請按一下 [提示的清單中的 [ DBPROMPT_NOPROMPT ]。
  6. 在 [屬性] 索引標籤中,按一下 [進階。[ IDBProperties::SetProperties ] 對話方塊隨即出現。
  7. 按一下以選取 [ DBPROP_AUTH_INTEGRATED ] 核取方塊,然後再按一下[確定]
  8. 完整連線-無可用描述] 對話方塊中,按一下[確定]。您會發現 < 徵狀=""> 一節所述的錯誤訊息。
注意用戶端電腦和 SQL Server 2000 SP3 的伺服器電腦必須位於相同的網域。當您嘗試從同一部電腦連線到 SQL Server 2000 SP3 的伺服器電腦,隨機 IP時,它會連接到 SQL Server 2000 SP3 的伺服器電腦,不會發生錯誤。

參考


如需詳細資訊,請造訪下列 Microsoft 開發人員網路 (MSDN) 網站︰如需其他資訊,請按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中的文件:

323444如何變更 Windows Server 2003 的網路介面卡的 IP 位址

如需其他資訊,請按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中的文件:

用來描述 Microsoft 軟體更新標準術語的編號 824684描述