修复︰ 您可以收到"无法生成 SSPI 上下文"错误消息,当您尝试连接到 SQL Server 2000 SP3 的服务器计算机


摘要


当您尝试从客户端计算机连接到 Microsoft SQL Server 2000 Service Pack 3 (SP3) 服务器计算机时,则连接失败并显示错误消息,如果不能从 Internet 协议 (IP) 地址解析服务器名称。因为 SQLOLEDB 不正确地解释 dbnetlib 的 ConnectionGetSvrUser 函数的返回值,将发生此问题。
  • 使用修复程序解决此问题。
  • 若要变通解决此问题,请手动创建在客户端计算机的 IP 地址的主机条目。
  • 要重现此问题,创建并配置动态 IP 地址的服务器计算机,然后从客户端计算机使用 SQL 查询分析器或行集查看器连接到服务器计算机。

现象


当您尝试将客户端计算机连接到 Microsoft SQL Server 2000 SP3 的服务器计算机时,不能从 Internet 协议 (IP) 地址解析服务器名称,则连接会失败。

当您连接到 SQL Server 2000 SP3 服务器计算机使用 SQL 查询分析器时,您会收到以下错误消息︰
服务器︰ 消息 11004,级别 16 状态 1
[Microsoft][ODBC SQL Server 驱动程序]无法生成 SSPI 上下文
当使用 SQL Server OLE DB 提供程序 (SQLOLEDB) 通过使用行集查看器来连接到 SQL Server 2000年服务器计算机时,您会收到以下错误消息︰
来源:"Microsoft OLE DB 提供程序的 SQL Server"

接口︰ IID_IDBInitialize
结果︰ 0x80004005 = E_FAIL

ISQLErrorInfo: [HY000] [0x00002afc]
传入: [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 的服务器计算机。


解析


Microsoft 提供了一个受支持的修补程序。但是,此修补程序用于解决本文中描述的问题。此修复程序仅适用于正经历此特定问题的系统。

如果此修复程序可供下载,则此知识库文章顶部"提供修补程序下载"部分。如果未显示此部分,将申请提交到 Microsoft 客户服务和支持,以获取此修复程序。

请注意如果出现其他问题或需要任何故障诊断时,您可能需要创建单独的服务请求。通常的支持费用将应用于其他支持问题和事项,不计入该特定的修补程序。有关 Microsoft 客户服务和支持电话号码或创建单独的服务请求的完整列表,请访问下面的 Microsoft 网站︰请注意"提供修补程序下载"窗体显示获取此修复程序的语言。如果看不到您的语言,则说明修补程序没有那种语言的版本。此修补程序的英文版具有的文件属性 (或更新) 在下表中列出。协调通用时间 (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. 找到主机文件,然后在记事本中打开该文件。

    请注意您可以在 %SystemRoot%\System32\Drivers\Etc 路径中找到的文件。
  3. 在文件末尾添加以下项︰
    随机 IP计算机名称

    请注意随机 IP是不在网络中的其他计算机使用的 IP 地址的占位符。计算机名是已在其上运行 SQL Server 2000 SP3 的计算机的名称的占位符。必须用至少一个空格分隔的随机 IP IP 地址和计算机名称。
  4. 文件菜单上单击保存
  5. 关闭该文件。

状态


Microsoft 已经确认这是"适用于"一节中列出的 Microsoft 产品中的问题。

详细信息


重现问题的步骤

配置的动态 IP 地址

  1. 登录到正在运行 SQL Server 2000 SP3 的计算机管理员。
  2. 在控制面板中,双击网络连接
  3. 双击想要修改的本地连接。
  4. 本地连接状态对话框中,单击属性。此时将显示本地连接属性对话框。
  5. 此连接使用下列项目框中,单击Internet 协议 (TCP/IP),,然后单击属性网际协议 (TCP/IP) 属性对话框。
  6. 自动获得 IP 地址,请单击,然后单击确定
  7. 本地连接属性对话框中,单击关闭

  8. 本地连接状态对话框中,单击关闭
  9. 单击开始,单击运行,键入cmd,然后单击确定
  10. 在命令提示符下,键入ping计算机名,然后再按 ENTER。

    请注意计算机名称是正在运行 SQL Server 2003年的计算机的名称的占位符

    您收到类似于以下错误消息︰
    执行 ping 命令计算机名称[动态 IP] 用 32 字节的数据︰

    动态 IP的回复︰ 字节 = 32 次 < 1 毫秒 TTL = 128
    动态 IP的回复︰ 字节 = 32 次 < 1 毫秒 TTL = 128
    动态 IP的回复︰ 字节 = 32 次 < 1 毫秒 TTL = 128

    对于动态 IPPing 统计信息︰
    的数据包: 发送 = 4,接收时间 = 4,丢失 = 0 (0%丢失),
    以毫秒为单位的近似往返次数︰
    最小值 = 0ms,最大值 = 0ms,平均值 = 0ms
    请注意动态 IP是计算机的计算机名的动态 IP 的占位符。
  11. 要退出命令提示符,键入退出,然后按 enter 键。
  12. 重复步骤 c 到 e。 单击使用下面的 IP 地址
  13. IP 地址框中,键入动态 IP地址。

    请注意动态 IP是计算机的计算机名的动态 IP 的占位符。
  14. 子网掩码框中,键入您的网络的子网掩码。
  15. 默认网关框中,键入网络中将您的网络连接到另一网络或 Internet 计算机或设备的 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) Web 站点︰有关其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章︰

323444如何更改 Windows Server 2003 中的网络适配器的 IP 地址

有关其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章︰

用于描述 Microsoft 软件更新的标准术语的824684说明