3

アプリが db サーバーに接続できない原因を突き止めようとしています。

起動時にデータベースに接続する Windows サービスがあります。このサービスは、信頼できる有線ネットワーク接続を備えたマシンで実行されます。スタートアップ自動でインストールされるため、通常はWindowsの起動時に起動し、ほとんどの場合、これで問題なく動作します。

ただし、XP マシンの 1 つのセット (私が制御できない) では、サービスが Windows の起動時に起動すると、データベース接続が失敗します。標準例外が発生します。

System.Data.SqlClient.SqlException: サーバーへの接続の確立中にエラーが発生しました。SQL Server 2005 に接続する場合、このエラーは、既定の設定では SQL Server がリモート接続を許可しないことが原因である可能性があります。(プロバイダー: SQL ネットワーク インターフェイス、エラー: 26 - 指定されたサーバー/インスタンスの検索中にエラーが発生しました)

これらのマシンでは、ユーザーがログインしてサービスを手動で開始すると、データベースに正しく接続されますが、これはかなり奇妙です。したがって、Windowsの起動時の問題は次のいずれかだと思います。

  • ネットワークが接続される前にサービスが開始されます
  • マシンが DNS に接続してサーバー名を解決する前に、サービスが開始されます (それが db サーバー名の解決方法である場合)。
  • 発信接続を最初に防止するポリシー/ファイアウォール/etc がマシン上にあります。
  • 何か他の...

ユーザーが手動でサービスを開始した場合、問題は発生しないため、問題を解決するために何かが起こったに違いありません。これは、起動時に実行されるがサービスの開始時に終了していないプロセスか、ユーザーがログインしたという事実のいずれかであると思います-おそらくログオンスクリプトの何か.

私はマシンに直接アクセスできないので、何が問題なのか、それが正しいかどうかを特定する方法を考え出す必要があります。診断プログラムを繰り返し展開することはできないため、最初は徹底する必要があります。

最初の質問は、この状況を引き起こす可能性のあるデスクトップ ポリシー、ネットワーク ポリシー、またはソフトウェアを知っている人はいますか? 2 番目の質問: 何が起こっているのかを正確に診断するにはどうすればよいですか?

インストールされて自動的に開始され、さまざまなアクションを実行して何が起こっているかを確認し、この情報をログに記録する新しい診断サービスを作成することを考えています。例えば:

  • 「ipconfig /all」を実行します (ネットワーク接続があるかどうかを確認するため)
  • IP アドレスでデータベース サーバーに ping を実行します (サーバーを検出できるかどうかを確認するため)。
  • データベース サーバーに名前で ping を実行する
  • サーバー名を含む HKLM レジストリ キーを確認します (HKLM レジストリが後で更新された場合)。
  • データベースへのSQL接続を作成します(これがいつ機能し始めるかを確認するため)
  • これらの手順を数秒ごとに繰り返します。

このサービスをインストールし、マシンを再起動し、しばらくしてからユーザーをログインさせます。診断により、有用な情報が表示されるはずです...しかし、より良いアイデアや追加の提案がある人はいますか?

また、適切な権限を持つユーザー アカウントとして実行するようにサービスを変更しようとしましたが、問題は解決しませんでした。サービスは手動で開始すると正常に動作するため、Local System アカウントには db サーバーに接続するための十分な権限があることに注意してください。したがって、この質問と同じではありません。

更新: 問題のあるマシンは Win XP を実行しています。

更新:この記事では、エラー コード 26 について詳しく説明しています。

4

3 に答える 3

3

これらのマシンに、サービスの開始時までにまだ起動していない何らかのファイアウォールがインストールされている可能性はありますか?サービスが完全に開始され、トラフィックを適切に監視できるようになるまで、ソフトウェアファイアウォールがインターネット接続を完全にロックダウンする場合があります。この場合、サービスはファイアウォールよりも速く起動します。アプリケーションからは切断されたネットワークのように見えます。

于 2009-03-26T21:04:13.433 に答える
2

いくつかのヒント:

  1. おそらく、サービスから別の Windows サービス (SQL Server や DTC など) への依存関係を設定して、サービスが開始される前にこれらのサービスが開始されるようにする必要があります。

  2. 別のオプション (実行している OS によって異なります) は、自動開始サービスを遅らせることです。http://msdn.microsoft.com/en-us/magazine/cc164252.aspxをご覧ください

  3. 3 番目のオプション: 最初に DB に接続する前に、Thread.Sleep (またはポーリング ループ) をサービス スレッドに配置するだけです。

于 2009-03-26T20:50:00.953 に答える