CORRECÇÃO: Recebe uma mensagem de erro "Não é possível gerar contexto SSPI" quando tenta ligar a um computador de servidor de SQL Server 2000 SP3


Sumário


Quando tenta ligar a um computador de servidor do Microsoft SQL Server 2000 Service Pack 3 (SP3) a partir de um computador cliente, a ligação falhar com uma mensagem de erro se o nome do servidor não possam ser resolvido a partir do endereço IP (protocolo Internet). Este comportamento ocorre porque o SQLOLEDB interpreta incorrectamente o valor devolvido da função de ConnectionGetSvrUser de dbnetlib.
  • Uma correcção que resolve este problema.
  • Para contornar este problema, crie manualmente uma entrada de anfitrião para o endereço IP no computador cliente.
  • Para reproduzir o problema, criar e configurar o endereço IP dinâmico do computador servidor e, em seguida, ligue para o computador servidor, utilizando o SQL Query Analyzer ou o Visualizador de conjunto de linhas de um computador cliente.

Sintomas


Quando tenta ligar um computador cliente a um computador de servidor do Microsoft SQL Server 2000 SP3, não é possível resolver o nome do servidor do endereço IP (protocolo Internet) e a ligação falhar.

Quando ligar ao computador do servidor de SQL Server 2000 SP3 com o SQL Query Analyzer, recebe a seguinte mensagem de erro:
Servidor: Erro 11004, de 16 de nível, indicar 1
[Microsoft] [Controlador ODBC SQL Server] Não é possível gerar contexto SSPI
Quando utilizar o SQL Server OLE DB Provider (SQLOLEDB) para ligar a um computador de servidor de SQL Server 2000 utilizando o Visualizador de conjunto de linhas, recebe a seguinte mensagem de erro:
Origem: "fornecedor de Microsoft OLE DB para SQL Server"

Interface: IID_IDBInitialize
Resultado: 0x80004005 = E_FAIL

ISQLErrorInfo: [HY000] [0x00002afc]
IErrorInfo: [0x00002afc] "não é possível gerar contexto SSPI"

Ficheiro: D:\MDACTools\rowsetviewer\CBase.cpp
Linha: 1067

Causa


Quando SQLOLEDB chama a função de ConnectionGetSvrUser da biblioteca dbnetlib, este interpreta erradamente que esta função devolve um valor boleano. A função ConnectionGetSvrUser destina-se para devolver uma anulação. Por conseguinte, qualquer que seja reside no registo EAX torna-se o valor de retorno.


A função ConnectionGetSvrUser internamente chama a função de gethostbyaddr . A função gethostbyaddr obtém o nome do anfitrião que corresponde a um determinado endereço IP. Se a função gethostbyaddr falhar, devolve um carácter zero para o registo EAX. Por conseguinte, a função ConnectionGetSvrUser devolve um valor Falso . Este comportamento provoca uma falha de início de sessão para o computador de servidor de SQL Server 2000 SP3.


Resolução


Existe uma correção suportada pela Microsoft. No entanto, esta correção destina-se apenas a corrigir o problema descrito neste artigo. Aplique esta correcção apenas em sistemas que tenham este problema específico.

Se a correcção estiver disponível para transferência, existirá uma secção de "Transferência de correcção disponível" na parte superior deste artigo da Base de dados de conhecimento. Se esta secção não for apresentado, submeta um pedido de suporte e serviço de cliente Microsoft para obter a correcção.

Nota Caso ocorram problemas adicionais ou se for necessária a resolução de problemas, poderá ter de criar um pedido de assistência separado. Os custos de normais do suporte serão aplicados a questões de suporte adicional e problemas incluídos nesta correção específica. Para uma lista completa dos números de telefone de suporte e serviço de cliente da Microsoft ou para criar um pedido de assistência separado, visite o seguinte Web site da Microsoft:Nota O formulário "Transferência de correcção disponível" apresenta os idiomas nos quais a correcção está disponível. Se não visualizar o seu idioma, é porque uma correcção não está disponível para esse idioma. Versão de a inglesa desta correcção tem os atributos de ficheiro (ou posteriores) listados na seguinte tabela. As datas e horas destes ficheiros são listadas na hora universal coordenada (UTC). Quando visualiza as informações do ficheiro, é convertido para a hora local. Para determinar a diferença entre a UTC e a hora local, utilize o separador Fuso horário na ferramenta Data e hora no painel de controlo.

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

Solução alternativa


Para contornar este problema, crie manualmente uma entrada de anfitrião no computador cliente para o endereço IP que pretende ligar.
  1. Inicie o Explorador do Windows.
  2. Localize o ficheiro Hosts e, em seguida, abra o ficheiro no bloco de notas.

    Nota É possível localizar o ficheiro no caminho %SystemRoot%\System32\Drivers\Etc.
  3. Adicione o seguinte no fim do ficheiro:
    IP aleatório Nome do computador

    Nota Aleatório IP é um marcador de posição para o endereço IP não está a ser utilizado por outro computador na rede. Nome do computador é um marcador de posição para o nome do computador que tem o SQL Server 2000 SP3 em execução. O endereço IP aleatório e o nome do Nome do computador tem de ser separados por, pelo menos, um espaço.
  4. No menu ficheiro , clique em Guardar.
  5. Feche o ficheiro.

Estado


A Microsoft confirmou que este é um problema nos produtos da Microsoft listados na secção "Aplica-se a".

Mais informações


Passos para reproduzir o problema

Configurar o endereço IP dinâmico

  1. Inicie sessão como administrador para o computador que esteja a executar o SQL Server 2000 SP3.
  2. No painel de controlo, faça duplo clique em Ligações de rede.
  3. Faça duplo clique na ligação de área local que pretende modificar.
  4. Na caixa de diálogo de Estado de ligação de área Local , clique em Propriedades. Aparece a caixa de diálogo Propriedades de ligação de área Local .
  5. Na caixa esta ligação utiliza os seguintes itens , faça clique sobre o Protocolo Internet (TCP/IP)e, em seguida, clique em Propriedades. É apresentada a caixa de diálogo Propriedades do protocolo Internet (TCP/IP) .
  6. Clique em obter automaticamente um endereço IPe, em seguida, clique em OK.
  7. Na caixa de diálogo Propriedades de ligação de área Local , clique em Fechar.

  8. Na caixa de diálogo de Estado de ligação de área Local , clique em Fechar.
  9. Clique em Iniciar, clique em Executar, escreva cmde, em seguida, clique em OK.
  10. Na linha de comandos, escreva o ping do Nome do computadore, em seguida, prima ENTER.

    Nota Nome do computador é um marcador de posição para o nome do computador que esteja a executar o SQL Server 2003

    Recebe uma mensagem de erro semelhante à seguinte:
    Efectuar ping do Nome do computador [IP dinâmico] com 32 bytes de dados:

    Resposta de IP dinâmico: bytes = 32 tempo < 1ms TTL = 128
    Resposta de IP dinâmico: bytes = 32 tempo < 1ms TTL = 128
    Resposta de IP dinâmico: bytes = 32 tempo < 1ms TTL = 128

    Estatísticas de ping de IP dinâmico:
    Pacotes: Enviados = 4, recebidos = 4, perdidos = 0 (0% perdas),
    Tempos aproximados de ida e volta em milissegundos:
    Mínimo = 0ms, máximo = 0ms, Média = 0ms
    Nota IP dinâmico é um marcador de posição para o IP dinâmico do computador Nome do computador .
  11. Para sair da linha de comandos, escreva exite, em seguida, prima ENTER.
  12. Repita os passos c a e clique em utilizar o seguinte endereço IP.
  13. Na caixa de endereço IP , escreva o endereço IP dinâmico .

    Nota IP dinâmico é um marcador de posição para o IP dinâmico do computador Nome do computador .
  14. Na caixa de máscara de sub-rede , escreva a máscara de sub-rede para a rede.
  15. Na caixa de gateway predefinido , escreva o endereço IP do computador ou do dispositivo na rede que liga a rede para outra rede ou à Internet.
  16. Na caixa servidor de DNS preferido , escreva o endereço IP do computador que resolve nomes de anfitrião para endereços IP.
  17. Na caixa servidor de DNS alternativo , escreva o endereço IP do computador DNS que pretende utilizar se o servidor DNS (Domain Name System) preferido ficar indisponível.
  18. Clique em Avançadas. As Definições de TCP/IP avançadas aparece.
  19. Em endereços IP, clique em Adicionar. Aparece a caixa de diálogo Endereço TCP/IP .
  20. Na caixa de endereço IP , escreva o endereço IP aleatório .

    Nota Aleatório IP é um marcador de posição para o endereço IP não está a ser utilizado por outro computador na rede.
  21. Na caixa de máscara de sub-rede , escreva a máscara de sub-rede para a rede e, em seguida, clique em Adicionar.
  22. Nas Definições de TCP/IP avançadas, clique em OK.
  23. Nas Propriedades do protocolo Internet (TCP/IP) , clique em OK. Na caixa de diálogo Propriedades de ligação de área Local , clique em Fechar. Na caixa de diálogo de Estado de ligação de área Local , clique em Fechar.

Ligar ao computador do servidor de SQL Server 2000 SP3 a partir de um computador cliente através do analisador de consultas de SQL

  1. Inicie o SQL Query Analyzer. É apresentada a caixa de diálogo ligar ao SQL Server .
  2. Na caixa Do SQL Server , escreva IP aleatórios.

    Nota Aleatório IP é um marcador de posição para o endereço IP não está a ser utilizado por outro computador na rede.
  3. Em Ligar utilizando, faça clique sobre a autenticação do Windows.
  4. Clique em OK. Repare a mensagem de erro mencionada na secção "Sintomas".

Ligar ao computador do servidor de SQL Server 2000 SP3 a partir de um computador cliente através do Visualizador de conjunto de linhas

  1. Inicie o Visualizador de conjunto de linhas. Aparece a janela de Microsoft OLE DB RowsetViewer .
  2. No menu ficheiro , clique em Ligar completo. Aparece a caixa de diálogo Completo Connect - n descrição disponível .
  3. Na lista de fornecedor , clique em SQLOLEDB em ligação.
  4. Na caixa de origem de dados , escreva IP aleatório em origem.

    Nota Aleatório IP é um marcador de posição para o endereço IP não está a ser utilizado por outro computador na rede.
  5. Em início de sessão, clique em DBPROMPT_NOPROMPT na lista de linha de comandos .
  6. No separador Propriedades , clique em Avançadas. Aparece a caixa de diálogo IDBProperties::SetProperties .
  7. Clique para seleccionar a caixa de verificação DBPROP_AUTH_INTEGRATED e, em seguida, clique em OK.
  8. Na caixa de diálogo Completo Connect - n descrição disponível , clique em OK. Repare a mensagem de erro mencionada na secção "Sintomas".
Nota O computador cliente e o computador com o SQL Server 2000 SP3 server tem de ser no mesmo domínio. Quando tenta ligar ao computador do servidor de SQL Server 2000 SP3 com o IP aleatórios a partir do mesmo computador, liga ao computador do servidor de SQL Server 2000 SP3 sem erro.

Referências


Para mais informações, visite os seguintes Web sites da Microsoft Developer Network (MSDN):
Descrição geral de OLE DB ferramentas de teste
http://msdn2.microsoft.com/en-us/library/ms721219.aspx
Para obter informações adicionais, clique no número de artigo seguinte para visualizar o artigo na Microsoft Knowledge Base:

323444 como alterar o endereço IP de uma placa de rede no Windows Server 2003

Para obter informações adicionais, clique no número de artigo seguinte para visualizar o artigo na Microsoft Knowledge Base:

824684 descrição da terminologia padrão utilizada para descrever actualizações de software da Microsoft