ユーザー「DOMAIN \ MACHINENAME $」のログインに失敗しました


120

:私は、これはほとんどの複製である知っているASP.NETとSQL Server 2008で「ログインユーザーのNT AUTHORITY \ IUSR」をするために失敗しました」エラーLINQとSystem.Data.SqlClient.SqlExceptionで-ユーザー名」のために失敗したログイン外部プロジェクト/クラスライブラリですが、サーバー上の他のアプリケーションと比較していくつかのものが足りません。理由はわかりません。

使用されているボックス:

Webボックス
SQLボックス
SQLテストボックス

私のアプリケーション:

LINQ-to-SQLを使用するクラスライブラリを参照するASP.NET Webアプリケーションがあります。クラスライブラリで正しく設定された接続文字列。ログインごとにユーザー 'username'のログインに失敗しました-外部プロジェクト/クラスライブラリのLINQでSystem.Data.SqlClient.SqlExceptionを使用して、この接続文字列をWebアプリケーションに追加しました。

接続文字列はSQL資格情報をそのまま使用します(Webアプリとクラスライブラリの両方で):

 <add name="Namespace.My.MySettings.ConnectionStringProduction"
        connectionString="Data Source=(SQL Test Box);Initial Catalog=(db name);Persist Security Info=True;User ID=ID;Password=Password"
        providerName="System.Data.SqlClient" />

この接続は、サーバーエクスプローラーに追加することで機能することが確認されています。これは、.dbmlファイルが使用している接続文字列です。

問題:

次のエラーが発生します。

System.Data.SqlClient.SqlException: Login failed for user 'DOMAIN\MACHINENAME$'.

ASP.NETおよびSQL Server 2008エラー「ユーザー 'NT AUTHORITY \ IUSR'のログインに失敗しました」を参照していますが、これは実際にはローカルネットワークサービスであり、他の非ドメイン名を使用すると機能しません。

しかし、SQLボックスとSQLテストボックスの両方のSQL Management Studioをチェックしていて、どちらもNT AUTHORITY/NETWORK SERVICE[セキュリティ]-> [ログイン]の下にあるため、データベースレベルで[セキュリティ]-> [ユーザー]の下にリストされていないが、データベースレベルのセキュリティがあるため、混乱しています。 ->ユーザー接続文字列にユーザーを表示します。

WebサーバーのNTFSレベルでは、ネットワークサービスがフルコントロールを持っている権限があります。

私が混乱しているのは、SQL ServerとSQL Test Boxの両方でデータベースを参照する他の多くのWebアプリケーションがWebサーバー上にあり、それらがすべて機能しているためです。しかし、クラスライブラリを使用している以外は、それらと現在のアプリケーションの違いを見つけることはできません。それは重要ですか?NTFSアクセス許可の確認、サーバーレベルとデータベースレベルでのセキュリティログインの設定、接続文字列と接続方法(SQL Server資格情報)、およびIISアプリケーションプールとその他のフォルダーオプションはすべて同じです。

これらのアプリケーションが、いずれかのSQLボックスの権限にmachinename $を追加せずに機能するのはなぜですか?しかし、それがこの問題を修正するために1つのリンクが私に言っていることです。


要約すると、データベースユーザーを使用していませんか?作成して、必要に応じてSAとSAを切り替えることができます...
jcolebrand

接続文字列で、[セキュリティ]-> [ログイン]領域で作成したデータベースユーザーを使用して、データベースの[セキュリティ]-> [ユーザー]に追加し、dbo権限を付与しました。これは、他のすべてのアプリも同様にした方法です。
SventoryMang

デフォルトのマシン名を使用したMSDNからの明確な説明は次のとおりです。基本的には、ドメイン/マシン$をSQLに追加するだけで、検索にヒットしません。blogs.msdn.microsoft.com/ericparvin/2015/04/14/...
ブレットMaiwald

回答:


156

NETWORK SERVICEおよびLocalSystemは、常にローカルで対応するアカウント(builtin \ network serviceおよびbuiltin \ system)として自分自身を認証しますが、どちらもリモートでマシンアカウントとして認証します。

このようなエラーが表示された場合は、Login failed for user 'DOMAIN\MACHINENAME$'NETWORK SERVICEまたはLocalSystemとして実行されているプロセスがリモートリソースにアクセスし、マシンアカウントとして自身を認証しており、認証が拒否されたことを意味します。

典型的な例は、NET SERVICE資格情報を使用してリモートSQL Serverに接続するように設定されたアプリプールで実行されるASPアプリケーションです。アプリプールは、アプリプールを実行するマシンとして認証され、このマシンアカウントはアクセスを許可する必要があります。

マシンアカウントへのアクセスが拒否された場合、マシンアカウントへのアクセスを許可する必要があります。サーバーが「DOMAIN \ MACHINE $」へのログインを拒否した場合は、ネットワークサービスではなく「DOMAIN \ MACHINE $」へのログイン権限を付与する必要があります。NETWORK SERVICEへのアクセスを許可すると、ローカル NETWORK SERVICEとして実行されてプロセスが、リモートプロセスではなく接続ます。リモートプロセスはDOMAIN \ MACHINE $として認証されるためです。

ASPアプリケーションがSQLログインとしてリモートSQL Serverに接続することを期待していて、DOMAIN \ MACHINE $に関する例外が発生する場合は、接続文字列で統合セキュリティを使用していることを意味します。これが予期しないものである場合は、使用している接続文字列がねじ込まれていることを意味します。


2
そのとおりです、説明ありがとうございます。しかし、問題はまだ残っています、私のアプリはすべて私のWebサーバーでホストされていますが、SQLまたはSQLテストボックスのデータベースにアクセスします。それはリモートアクセスでしょうか?しかし、それらは機能しています...しかし、私のSQLボックスはどちらもDOMAIN \ MACHINENAME $アクセスを許可していません。
SventoryMang

1
また、SQLログインとしてSQLサーバーに接続することを期待していますが、接続文字列を投稿しましたが、Integrated Security = Trueオプションを使用していません。他に何ができますか?
SventoryMang

2
考えられる説明は3つあります。1)統合認証の代わりにSQL認証を使用します(例ではconn文字列にユーザーIDとパスワードがあるため、最も可能性が高いようです)2)統合認証を使用し、アプリポーリングで実行します。別の資格情報を使用する、または3)統合認証を使用するが、ASPアプリが呼び出し元を偽装するため、制約付き委任がトリガーされる:technet.microsoft.com/en-us/library/cc739587%28WS.10%29.aspx
Remus Rusanu、

2
Webアプリプロジェクトは、dllではなく、クラスライブラリプロジェクトを参照する必要があります。クラスライブラリプロジェクトをWebアプリソリューションに追加し、dllへの参照を削除して、プロジェクトへの参照を追加します。このようにして、デプロイまたはテスト時に、小売Webアプリは小売クラスdllを参照し、デバッグはデバッグを自動的に参照します。
Remus Rusanu

1
これで問題はありませんが、SQLにマシンログインをどのように追加しますか?-どちらも同じドメイン上にあり、統合セキュリティを使用したいと思います。しかし、「Domain \ MachineName $」という名前のアカウントを追加するだけでは完全に失敗します(たとえば、アカウントが存在せず、オブジェクトエクスプローラーがチョークしてそのようなものを見つけられません)。
BrainSlugs83 2018年

33

このエラーは、IISでアプリケーションを構成し、IISがSQL Serverにアクセスして、適切な権限のない資格情報でログインしようとした場合に発生します。このエラーは、レプリケーションまたはミラーリングが設定されている場合にも発生する可能性があります。常に機能し、非常にシンプルなソリューションについて説明します。SQL Server >>セキュリティ>>ログインに移動し、NT AUTHORITY \ NETWORK SERVICEを右クリックして[プロパティ]を選択します

新しく開いたログインプロパティの画面で、[ユーザーマッピング]タブに移動します。次に、[ユーザーマッピング]タブで、目的のデータベース、特にこのエラーメッセージが表示されるデータベースを選択します。下の画面で、役割db_ownerを確認します。OKをクリックします。


7
Webアプリケーションとデータベースが同じマシン上にあるため、これが私にとっての解決策でした。それでも「ユーザー「DOMAIN \ MACHINENAME $」のログインに失敗しました」というエラーが表示されますが、SQLログインにマシンを追加しても効果がありませんでしたが、「NT AUTHORITY \ NETWORK SERVICE」を追加すると効果がありました。必要でない限り、ロールdb_ownerを使用すべきではありませんが、通常はdb_datareaderとdb_datawriterで十分です。
JimiSweden 2016

18

私の場合Identity="ApplicationPoolIdentity"は、IISアプリケーションプール用でした。

IIS APPPOOL\ApplicationNameユーザーをSQL Server に追加した後、機能します。


5
これは、IISとSQLサーバーが同じマシン上にある場合にのみ機能すると思います。
ロブ・デイビス

1
これは私のために働いた!ローカルIIS-SQLサーバーをセットアップしています。
Vin Shahrdar 2017年

1
どうもありがとうございました。この問題は、私のローカル開発環境をSQL Server 2014から2017にアップグレードした後に発生しました。あなたの提案は、この状況での特効薬でした。
MFry 2018

ありがとう、私のためにも働いた。私が強調したいのは、アプリケーションプールがプールIDで実行するように設定されていて、実際に 'DOMAIN \ MACHINENAME $'であってもログインが失敗した場合でも、エラーメッセージはまだ 'ユーザー' DOMAIN \ MACHINENAME $のログインに失敗しました 'です。接続する権限が付与されています。私に誤解を招くエラーメッセージのようです。
mivra

16

基本的にこれを解決するには、次のような設定が必要です

  • ApplicationPoolIdentityで実行されているWebアプリ
  • 接続文字列でWindows認証を使用してADO.Netを介してデータベースに接続するWebアプリケーション

Windows認証で使用される接続文字列には、Trusted_Connection=Yes属性または同等の属性が含まIntegrated Security=SSPIれていますWeb.configファイルにます

データベース接続はWindows認証モードです。したがって、アプリケーションプール IDをApplicationPoolIdentityからドメインログイン資格情報に変更するだけで解決しました DomainName \ MyloginIdにました。

ステップ:

  1. アプリケーションプールをクリックします
  2. アプリケーションの名前を選択します

  3. 詳細設定に移動

  4. 展開プロセスモデルをクリックしアイデンティティを。右端の3つのドットをクリックします。
  5. [ 設定... ]ボタンをクリックして、ドメインのログイン認証情報を入力します

私にとってそれは解決されました。

注:本番環境またはIT環境では、アプリプールIDの同じドメインにサービスアカウントがある場合があります。その場合は、ログインではなくサービスアカウントを使用してください。


上記の質問の場合、これは受け入れられる答えになるはずです。
マキル

14

私のために働いたトリックIntegrated Securityは私の接続文字列から削除し、あなたの図書館のUser ID=userName; Password=password接続文字列に通常の接続文字列を追加するApp.configことでしたが、統合セキュリティを使用していないかもしれませんが、で作成されたものWeb.configはです!


3
10億ありがとう。巨大な、大きな助け。ありがとう、ありがとう、ありがとう。これは、確かに、非常に明白ですが、将来の人々にとっては、ユーザーID =何かです。パスワード=何か;
shubniggurath 2013年

2
投稿のタイトルでも同じエラーが発生しました。「 'trusted connection = true'」がデータベース接続文字列にある場合、「ユーザーID = yourUseridパスワード= yourPassword」が無視されることがわかりました。文字列から "trusted connection = true '"を削除して、問題を修正しました。これは、アプリケーションをVS 2012のデバッグからiis 8に移動するまで発生しませんでした
T3.0

12

同僚にも同じエラーがありましたが、それはIISの構成エラーのせいでした。
間違ったアプリケーションプールがWebアプリケーションに割り当てられました。

実際、ニーズを満たすために、特定のIDを持つカスタムアプリケーションプールを使用しています。

彼のローカルIISマネージャー->サイト->既定のWebサイト->私たちのWebアプリ名->基本設定...では、アプリケーションプールはカスタムアプリケーションプールではなく "DefaultAppPool"でした。

正しいアプリケーションプールを設定することで問題は解決しました。


11

<identity impersonate="true" />は私のweb.config に追加し、それはうまくいきました。


7
これは、ASP.NETアプリケーションが全体として実行されるコンテキストを変更することを理解してください。デフォルトの 'NETWORK SERVICE'コンテキストで実行する代わりに、アプリケーションを使用するユーザーのコンテキスト(つまりDomain \ someUser)で実行されるようになりました。これは時々大丈夫ですが、この変更がOPの単なる迅速な修正ではなく、望まないかもしれないし望まないかもしれない他の下流の影響があることを理解するだけです。
atconway 2014


6

私にとっては、デフォルトのビルトインアカウント 'ApplicationPoolIdentity'を、データベースへのアクセスが許可されているネットワークアカウントに置き換えると、問題は解決しました。

設定は、Internet Information Server(IIS 7+)>アプリケーションプール>詳細設定>プロセスモデル> IDで行うことができます



3

Analysis Servicesデータベースの処理中に、同様のエラーメッセージが表示されていました。Analysis Servicesインスタンスの実行に使用されたユーザー名がSQL Serverのセキュリティログインに追加されていないことが判明しました。

SQL Server 2012では、SQL Serverと分析サービスは、デフォルトで異なるユーザーとして実行するように構成されています。デフォルトを使用している場合は、ASユーザーがデータソースにアクセスできることを常に確認してください。


1
私も同じ問題を抱えていました。SSASからのエラーは同じですが、アカウントはネットワークサービスではありません。アカウントは実際には次の
とおりです。NTService

2

あなたが持っているかどうかを確認してください

User Instance=true

接続文字列で。それを削除してみてください。問題が解決します。


2

SQL Server認証ユーザーでもこのエラーが発生しました

いくつかの修正を試しましたが、うまくいきませんでした。

私の場合の解決策は、Management Studio:Properties / Securityで、SQL Server認証を許可するように「サーバー認証モード」を構成することでした。


1

誰もが見落としているように見える唯一の点は、統合セキュリティ= trueが必要な場合があるということです。サイトをプールアカウントで実行している可能性があります。それで十分なので、プールではなく元のユーザー資格情報でSQLサーバーにアクセスすることも可能です。これは制約付き委任と呼ばれます。これを有効にしてSPNウィンドウを設定すると、プールの資格情報が、最終サービスに送られるユーザーのオンリクエストに変換されます(SQLはそのようなサービスの1つにすぎません)。WebサーバーでSQL要求を処理するSQLサーバーを1つだけ登録する必要があります。これをすべて設定するのは、私がここで正確に説明しようとするには多すぎます。自分で作業するのにかなり時間がかかりました。


0

問題を修正するために数時間を費やし、ついにそれを手に入れました-SQL Server Browserは「停止」されました。修正はそれを「自動」モードに変更することです:

無効になっている場合は、[コントロールパネル]-> [管理ツール]-> [サービス]に移動し、SQL Serverエージェントを探します。右クリックして[プロパティ]を選択します。[スタートアップの種類]ドロップダウンから、[無効]から[自動]に変更します。

ここから引用


0

以前に同じ問題がありましたが、Persist Security Info=Trueconnectionstringから削除するとうまくいきました。


0

クライアントがSQL Serverの名前を変更したときに、この問題に遭遇しました。SQLレポートサービスは、古いサーバー名に接続するように構成されました。古いサーバー名は、新しいサーバー名のIPにリダイレクトされるエイリアスも作成しました。

古いIISアプリはすべて機能しており、エイリアスを介して新しいサーバー名にリダイレクトしていました。直感的に、SSRSが実行されているかどうかを確認しました。SSRSサイトに接続しようとすると、エラーが発生しました。

「サービスを利用できません。システム管理者に連絡して問題を解決してください。システム管理者:レポートサーバーがデータベースに接続できません。データベースが実行中でアクセス可能であることを確認してください。詳細については、レポートサーバーのトレースログを確認することもできます」

サーバーで実行されていましたが、古いサーバー名のエイリアスを使用していたため、接続に失敗しました。古いサーバー/エイリアスの代わりに新しいサーバー名を使用するようにSSRSを再構成すると修正されました。


0
  1. アプリプールIDをローカルシステムに変更する
  2. SQL管理>セキュリティ>ログイン
    1. NT AUTHORITY \ SYSTEMをダブルクリックして検索します
    2. ユーザーマッピング>データベースを確認し、以下に役割を割り当てます。
    3. 正しいパスワードでセキュリティログインのユーザーデータベースを作成することも忘れないでください。

0

次を使用してソリューションをテストしようとしたときにこのエラーが発生しました

string cn = "Data Source=[servername];Integrated Security=true;Initial Catalog=[dbname];";

私が解決した方法は、Visual Studioを開いて別のアカウントで実行する必要があったことです。これは、開くために使用していたアカウントが管理者アカウントではなかったためです。

したがって、問題が私の問題と似ている場合は、VSをタスクバーに固定し、Shiftキーと右クリックを使用してメニューを開き、別のユーザーとしてVSを開くことができます。 ここに画像の説明を入力してください


0

ここにいくつかの良い答えがあることを感謝しますが、私がこれを実行する時間を失ったばかりなので、うまくいけばこれは誰かを助けることができます。

私の場合、すべてが問題なく機能していたが、問題に示されたエラーのため、明らかな理由もなく停止した。

IISはネットワークサービスとして実行されており、ネットワークサービスは以前にSQL Serverで設定されていました(この投稿の他の回答を参照してください)。サーバーの役割とユーザーのマッピングは正しいように見えました。

問題は、明白な理由はまったくありません。ネットワークサービスは、データベースで「拒否」ログイン権限に切り替わりました。

修正するには:

  1. SSMS>セキュリティ>ログインを開きます。
  2. 「NT AUTHORITY \ NETWORK SERVICE」を右クリックして、「プロパティ」をクリックします。
  3. 「ステータス」タブに移動し、「許可」に設定しますPermission to Connect To Database Engine

許可されたネットワークサービス

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.