Anmeldung für Benutzer 'DOMAIN \ MACHINENAME $' fehlgeschlagen

120

Ich weiß, dass dies fast ein Duplikat von: Der Fehler "Anmeldung für Benutzer 'NT AUTHORITY \ IUSR' fehlgeschlagen" in ASP.NET und SQL Server 2008 und Anmeldung für Benutzer 'Benutzername' - System.Data.SqlClient.SqlException mit LINQ in fehlgeschlagen externe Projekt- / Klassenbibliothek, aber einige Dinge passen nicht zu anderen Anwendungen auf meinem Server, und ich bin mir nicht sicher, warum.

Verwendete Boxen:

Web Box
SQL Box
SQL Test Box

Meine Bewerbung:

Ich habe eine ASP.NET-Webanwendung, die auf eine Klassenbibliothek verweist, die LINQ-to-SQL verwendet. Die Verbindungszeichenfolge wurde ordnungsgemäß in der Klassenbibliothek eingerichtet. Wie pro Anmeldung für den Benutzer ‚username‘ ist fehlgeschlagen - System.Data.SqlClient.SqlException mit LINQ in externem Projekt / Klassenbibliothek ich auch diese Verbindungszeichenfolge an die Web Application hinzugefügt.

Die Verbindungszeichenfolge verwendet SQL-Anmeldeinformationen (sowohl in der Webanwendung als auch in der Klassenbibliothek):

 <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" />

Diese Verbindung wurde durch Hinzufügen zum Server-Explorer als funktionsfähig bestätigt. Dies ist die Verbindungszeichenfolge, die meine .dbml-Datei verwendet.

Das Problem:

Ich erhalte folgende Fehlermeldung:

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

Jetzt darauf verweisen Der Fehler "Anmeldung für Benutzer 'NT AUTHORITY \ IUSR' fehlgeschlagen" in ASP.NET und SQL Server 2008 besagt, dass dies wirklich der lokale Netzwerkdienst ist und die Verwendung eines anderen Nicht-Domänennamens nicht funktioniert.

Ich bin jedoch verwirrt, weil ich sowohl SQL Box als auch SQL Test Box SQL Management Studio aktiviert habe und beide NT AUTHORITY/NETWORK SERVICEunter Sicherheit -> Anmeldungen auf Datenbankebene nicht unter Sicherheit -> Benutzer aufgeführt sind, sondern auf Datenbankebene Sicherheit -> Benutzer Ich habe den Benutzer in der Verbindungszeichenfolge angezeigt.

Auf NTFS-Ebene auf dem Webserver haben die Berechtigungen die volle Kontrolle über NETWORK SERVICE.

Der Grund, warum ich verwirrt bin, ist, dass ich viele andere Webanwendungen auf meinem Webserver habe, die auf Datenbanken sowohl in SQL Box als auch in SQL Test Box verweisen und alle funktionieren. Ich kann jedoch keinen Unterschied zwischen ihnen und meiner aktuellen Anwendung feststellen, außer dass ich eine Klassenbibliothek verwende. Wird das wichtig sein? Das Überprüfen der NTFS-Berechtigungen, das Einrichten von Sicherheitsanmeldungen auf Server- und Datenbankebene, die Verbindungszeichenfolge und die Verbindungsmethode (SQL Server-Anmeldeinformationen) sowie der IIS-Anwendungspool und andere Ordneroptionen sind identisch.

Warum funktionieren diese Anwendungen, ohne den Maschinennamen $ zu den Berechtigungen einer meiner SQL-Boxen hinzuzufügen? Aber genau das sagt mir der eine Link, um dieses Problem zu beheben.

SventoryMang
quelle
Um es noch einmal zusammenzufassen: Sie verwenden keinen Datenbankbenutzer? Wir erstellen eine und können zwischen ihr und SA
wechseln,
In der Verbindungszeichenfolge verwende ich einen Datenbankbenutzer, den ich im Bereich Sicherheit -> Anmeldungen erstellt, zu Sicherheit -> Benutzer der Datenbank hinzugefügt und ihm dbo-Berechtigungen erteilt habe. So habe ich auch alle meine anderen Apps gemacht.
SventoryMang
Hier ist eine klare Erklärung von MSDN unter Verwendung des Standard-Computernamens. Im Grunde fügen Sie einfach die Domäne / Maschine $ zu SQL hinzu, ohne auf Suche zu klicken. blogs.msdn.microsoft.com/ericparvin/2015/04/14/…
Brett Maiwald

Antworten:

156

NETWORK SERVICE und LocalSystem authentifizieren sich immer lokal als das entsprechende Konto (integrierter \ Netzwerkdienst und integriertes \ System), aber beide authentifizieren sich remote als Computerkonto.

Wenn Sie einen Fehler wie Login failed for user 'DOMAIN\MACHINENAME$'diesen sehen, bedeutet dies, dass ein Prozess, der als NETWORK SERVICE oder als LocalSystem ausgeführt wird, auf eine Remote-Ressource zugegriffen hat, sich als Computerkonto authentifiziert hat und die Autorisierung verweigert wurde.

Ein typisches Beispiel wäre eine ASP-Anwendung, die in einem App-Pool ausgeführt wird, um NETWORK SERVICE-Anmeldeinformationen zu verwenden und eine Verbindung zu einem Remote-SQL Server herzustellen: Der App-Pool authentifiziert sich als der Computer , auf dem der App-Pool ausgeführt wird, und ist dieses Computerkonto, dem Zugriff gewährt werden muss .

Wenn der Zugriff auf ein Computerkonto verweigert wird, muss dem Computerkonto Zugriff gewährt werden. Wenn sich der Server weigert, sich bei 'DOMAIN \ MACHINE $' anzumelden, müssen Sie 'DOMAIN \ MACHINE $' Anmelderechte gewähren, nicht bei NETWORK SERVICE. Wenn Sie Zugriff auf NETWORK SERVICE gewähren, kann ein lokaler Prozess, der als NETWORK SERVICE ausgeführt wird, eine Verbindung herstellen, nicht ein Remote-Prozess, da sich der Remote-Prozess als DOMAIN \ MACHINE $ authentifiziert.

Wenn Sie erwarten, dass die asp-Anwendung als SQL-Anmeldung eine Verbindung zum Remote-SQL Server herstellt, und Sie Ausnahmen über DOMAIN \ MACHINE $ erhalten, bedeutet dies, dass Sie Integrated Security in der Verbindungszeichenfolge verwenden. Wenn dies unerwartet ist, bedeutet dies, dass Sie die von Ihnen verwendeten Verbindungszeichenfolgen vermasselt haben.

Remus Rusanu
quelle
2
Richtig, was ich gesammelt habe, danke für die Erklärung. Es bleibt jedoch die Frage, ob alle meine Apps auf meinem Webserver gehostet werden, aber auf eine Datenbank in SQL oder SQL-Testboxen zugreifen. Das wäre ja Remotezugriff. Sie funktionieren zwar ... aber keine meiner SQL-Boxen gewährt DOMAIN \ MACHINENAME $ Zugriff.
SventoryMang
1
Oh, ich erwarte auch, dass ich mich als SQL-Login mit SQL Server verbinde, aber ich habe meine Verbindungszeichenfolgen gepostet. Ich verwende nicht die Option Integrated Security = True. Was könnte es sonst sein?
SventoryMang
2
Es gibt drei mögliche Erklärungen: 1) Sie verwenden SQL-Authentifizierung anstelle von integrierter Authentifizierung (was am plausibelsten erscheint, da Ihr Beispiel eine Benutzer-ID und ein Kennwort in der Verbindungszeichenfolge enthält). 2) Sie verwenden integrierte Authentifizierung und werden in einer App-Umfrage ausgeführt die einen anderen Berechtigungsnachweis verwenden oder 3) sie verwenden die integrierte Authentifizierung, aber die ASP-App gibt sich als Anrufer aus und löst so eine eingeschränkte Delegierung aus: technet.microsoft.com/en-us/library/cc739587%28WS.10%29.aspx .
Remus Rusanu
2
Ihr Web - App - Projekt sollte die Klassenbibliothek Referenz - Projekt , nicht die dll. Fügen Sie das Klassenbibliotheksprojekt zur Webanwendungslösung hinzu, entfernen Sie dann den Verweis auf die DLL und fügen Sie einen Verweis auf das Projekt hinzu. Auf diese Weise verweist die Web-App für den Einzelhandel beim Bereitstellen oder Testen auf die DLL der Einzelhandelsklasse, und das Debuggen verweist automatisch auf das Debuggen.
Remus Rusanu
1
Obwohl dies alles gut und schön ist, wie fügen Sie die Maschinenanmeldung zu SQL hinzu? - Sie befinden sich beide in derselben Domäne, und ich würde es vorziehen, integrierte Sicherheit zu verwenden. Das Hinzufügen eines Kontos mit dem Namen "Domain \ MachineName $" schlägt jedoch vollständig fehl (es existiert nicht, und der Objekt-Explorer erstickt und findet so etwas nicht).
BrainSlugs83
33

Dieser Fehler tritt auf, wenn Sie Ihre Anwendung mit IIS konfiguriert haben und IIS zu SQL Server wechselt und versucht, sich mit Anmeldeinformationen anzumelden, die nicht über die richtigen Berechtigungen verfügen. Dieser Fehler kann auch auftreten, wenn die Replikation oder Spiegelung eingerichtet ist. Ich werde eine Lösung durchgehen, die immer funktioniert und sehr einfach ist. Gehen Sie zu SQL Server >> Sicherheit >> Anmeldungen, klicken Sie mit der rechten Maustaste auf NT AUTHORITY \ NETWORK SERVICE und wählen Sie Eigenschaften

Wechseln Sie im neu geöffneten Bildschirm der Anmeldeeigenschaften zur Registerkarte "Benutzerzuordnung". Wählen Sie dann auf der Registerkarte "Benutzerzuordnung" die gewünschte Datenbank aus, insbesondere die Datenbank, für die diese Fehlermeldung angezeigt wird. Überprüfen Sie im unteren Bildschirm die Rolle db_owner. OK klicken.

Zain Ali
quelle
7
Dies war die Lösung für mich, da sich die Webanwendung und die Datenbank auf demselben Computer befinden. Ich habe immer noch den Fehler "Anmeldung für Benutzer 'DOMAIN \ MACHINENAME $ fehlgeschlagen" erhalten, aber das Hinzufügen des Computers zu SQL-Anmeldungen hat nicht geholfen, das Hinzufügen von "NT AUTHORITY \ NETWORK SERVICE" jedoch. Obwohl Sie die Rolle db_owner nur verwenden sollten, wenn sie benötigt wird, sind normalerweise db_datareader und db_datawriter ausreichend.
JimiSweden
18

In meinem Fall hatte ich Identity="ApplicationPoolIdentity"für meinen IIS Application Pool.

Nachdem ich IIS APPPOOL\ApplicationNameSQL Server hinzugefügt habe, funktioniert es.

nZeus
quelle
5
Ich glaube, dass dies nur funktioniert, wenn sich IIS und der SQL Server auf demselben Computer befinden.
Rob Davis
1
Das hat bei mir funktioniert! Ich habe ein lokales IIS-SQL-Server-Setup.
Vin Shahrdar
1
Vielen Dank. Dieses Problem begann für mich nach dem Upgrade meiner lokalen Entwicklungsumgebung von SQL Server 2014 auf 2017. Ihr Vorschlag war in dieser Situation die Silberkugel.
MFry
Danke, hat auch für mich gearbeitet. Was ich hervorheben möchte, ist, dass die Fehlermeldung immer noch "Anmeldung für Benutzer 'DOMAIN \ MACHINENAME $ fehlgeschlagen" lautet, obwohl der Anwendungspool so eingestellt ist, dass er unter Poolidentität ausgeführt wird und die Anmeldung fehlschlägt, selbst wenn' DOMAIN \ MACHINENAME $ 'tatsächlich ist wird die Berechtigung zum Verbinden erteilt. Scheint mir eine irreführende Fehlermeldung zu sein.
Mivra
16

Grundsätzlich müssen wir einige Einstellungen vornehmen, um dies zu beheben

  • Webanwendung Wird unter ApplicationPoolIdentity ausgeführt
  • Webanwendung, die über ADO.Net mithilfe der Windows-Authentifizierung in der Verbindungszeichenfolge eine Verbindung zu Datenbanken herstellt

Die bei der Windows-Authentifizierung verwendete Verbindungszeichenfolge enthält entweder ein Trusted_Connection=YesAttribut oder das entsprechende Attribut Integrated Security=SSPIin der Web.configDatei

Meine Datenbankverbindung befindet sich im Windows-Authentifizierungsmodus. Daher habe ich das Problem gelöst, indem ich einfach die Identität der Anwendungspools von ApplicationPoolIdentity in mein Domänenprotokoll mit den Anmeldeinformationen DomainName \ MyloginId geändert habe

Schritt:

  1. Klicken Sie auf Anwendungspools
  2. Wählen Sie den Namen Ihrer Anwendung

  3. Gehen Sie zu Erweiterte Einstellungen

  4. Erweitern Sie Prozessmodell und klicken Sie auf Identität . Klicken Sie auf drei Punkte am rechten Ende.
  5. Klicken Sie auf die Schaltfläche Festlegen ... und geben Sie Ihre Anmeldeinformationen für die Domain-Anmeldung an

Für mich war es gelöst.

Hinweis: In der Produktions- oder IT-Umgebung haben Sie möglicherweise ein Dienstkonto unter derselben Domäne für die Identität des App-Pools. Verwenden Sie in diesem Fall das Dienstkonto anstelle Ihres Logins.

Raj Baral
quelle
Für die obige Frage sollte dies die akzeptierte Antwort sein.
Makil
14

Der Trick, der bei mir funktioniert hat, bestand darin, Integrated Securityaus meiner Verbindungszeichenfolge zu entfernen und eine reguläre User ID=userName; Password=passwordVerbindungszeichenfolge in die App.configBibliothek aufzunehmen. Möglicherweise wird keine integrierte Sicherheit verwendet, aber die in erstellte Web.configist!

winy101
quelle
3
Eine Milliarde Dankeschön an Sie. Riesige, große Hilfe. Danke danke danke. Ich bin mir sicher, dass dies sehr offensichtlich ist, aber für zukünftige Leute ist es Benutzer-ID = etwas; Passwort = etwas;
Shubniggurath
2
Ich habe den gleichen Fehler im Titel des Beitrags erhalten. Ich habe festgestellt, dass die 'Benutzer-ID = Ihr Benutzer-ID-Kennwort = Ihr Kennwort' ignoriert wird, wenn "'vertrauenswürdige Verbindung = wahr'" in der Datenbankverbindungszeichenfolge enthalten ist. Ich habe "'vertrauenswürdige Verbindung = wahr'" aus meiner Zeichenfolge entfernt und das hat mein Problem behoben. Dies geschah erst, als ich die Anwendung vom Debuggen in VS 2012 auf iis 8
verschoben habe
12

Ein Kollege hatte den gleichen Fehler und er war auf einen kleinen Konfigurationsfehler in IIS zurückzuführen.
Für die Webanwendung wurde der falsche Anwendungspool zugewiesen.

In der Tat verwenden wir einen benutzerdefinierten Anwendungspool mit einer bestimmten Identität, um unsere Anforderungen zu erfüllen.

In seinem lokalen IIS-Manager -> Sites -> Standardwebsite -> Name unserer Webanwendung -> Grundeinstellungen ... Der Anwendungspool war "DefaultAppPool" anstelle unseres benutzerdefinierten Anwendungspools.

Das Einstellen des richtigen Anwendungspools löste das Problem.

Julien P.
quelle
11

Ich habe <identity impersonate="true" />zu meiner web.config hinzugefügt und es hat gut funktioniert.

simonm
quelle
7
Wenn Sie dies verstehen, ändert sich der Kontext, unter dem die ASP.NET-Anwendung ausgeführt wird, vollständig. Anstatt im Standardkontext 'NETWORK SERVICE' ausgeführt zu werden, wird es jetzt im Kontext des Benutzers ausgeführt, der die Anwendung verwendet (dh Domain \ someUser). Dies ist manchmal in Ordnung, aber nur zu verstehen, dass diese Änderung nicht nur eine schnelle Lösung für das OP ist und andere nachgelagerte Auswirkungen hat, die möglicherweise / möglicherweise nicht erwünscht sind.
Atconway
6

Für mich wurde das Problem behoben, als ich das integrierte Standardkonto 'ApplicationPoolIdentity' durch ein Netzwerkkonto ersetzte, das Zugriff auf die Datenbank hatte.

Einstellungen können unter Internet Information Server (IIS 7+)> Anwendungspools> Erweiterte Einstellungen> Prozessmodell> Identität vorgenommen werden

Remco
quelle
4

Für mich wurde das Problem mit 'DOMAIN \ MACHINENAME $' behoben, indem DefaultApplicationPoolIdentity auf gesetzt wurde NetworkService.

Geben Sie hier die Bildbeschreibung ein

Arsen Khachaturyan
quelle
3

Bei der Verarbeitung einer Analysis Services-Datenbank wurden ähnliche Fehlermeldungen angezeigt. Es stellte sich heraus, dass der Benutzername, mit dem die Analysis Services-Instanz ausgeführt wurde, nicht zu den Sicherheitsanmeldungen des SQL Servers hinzugefügt wurde.

In SQL Server 2012 sind die SQL Server- und Analysedienste so konfiguriert, dass sie standardmäßig als unterschiedliche Benutzer ausgeführt werden. Wenn Sie die Standardeinstellungen übernommen haben, stellen Sie immer sicher, dass der AS-Benutzer Zugriff auf Ihre Datenquelle hat!

Philip Atz
quelle
1
Ich hatte das gleiche Problem. Der Fehler von SSAS ist der gleiche, aber das Konto ist kein Netzwerkdienst. Das Konto ist eigentlich: NT Service \ MSOLAP $ INSTANCENAME
cdonner
2

Überprüfen Sie, ob Sie haben

User Instance=true

in Verbindungszeichenfolge. Versuchen Sie, es zu entfernen, um Ihr Problem zu beheben.

Sarath Avanavu
quelle
2

Ich hatte auch diesen Fehler mit einem SQL Server-authentifizierten Benutzer

Ich habe einige der Korrekturen ausprobiert, aber sie haben nicht funktioniert.

In meinem Fall bestand die Lösung darin, den "Serverauthentifizierungsmodus" so zu konfigurieren, dass die SQL Server-Authentifizierung unter Management Studio: Eigenschaften / Sicherheit möglich ist.

Arjan
quelle
1

Der einzige Punkt, den anscheinend jeder übersehen hat, ist, dass Sie möglicherweise integrierte Sicherheit = true wünschen. Möglicherweise wird die Site unter einem Poolkonto ausgeführt. Das ist alles in Ordnung und es ist immer noch möglich, den SQL Server mit den ursprünglichen Benutzeranmeldeinformationen und nicht mit den Pools zu erreichen. Es wird als eingeschränkte Delegierung bezeichnet. Wenn Sie es aktivieren und ein SPN einrichten, übersetzt Windows die Anmeldeinformationen des Pools mit den Anmeldeinformationen des Benutzers, wenn Anforderungen an den endgültigen Dienst gesendet werden (SQL ist nur ein solcher Dienst). Sie müssen den EINZIGEN SQL-Server registrieren, der SQL-Anforderungen auf dem Webserver bearbeitet. Das alles einzurichten ist zu viel für mich, um es hier genau zu beschreiben. Ich habe eine ganze Weile gebraucht, um es selbst durchzuarbeiten.

Todd Beaulieu
quelle
0

Ich habe ein paar Stunden damit verbracht, das Problem zu beheben, und habe es endlich verstanden - der SQL Server-Browser wurde "gestoppt". Das Update besteht darin, es in den "Automatik" -Modus zu ändern:

Wenn es deaktiviert ist, gehen Sie zu Systemsteuerung-> Verwaltung-> Dienste und suchen Sie nach dem SQL Server-Agenten. Klicken Sie mit der rechten Maustaste und wählen Sie "Eigenschaften". Wechseln Sie in der Dropdown-Liste "Starttyp" von "Deaktiviert" zu "Automatisch".

Zitat von hier

Ein Petrov
quelle
0

Ich hatte das gleiche Problem früher, das Entfernen Persist Security Info=Truevon der Verbindungszeichenfolge funktionierte für mich.

msk
quelle
0

Ich bin auf dieses Problem gestoßen, als ein Client einen SQL Server umbenannte. Der SQL Reporting Service wurde so konfiguriert, dass eine Verbindung zum alten Servernamen hergestellt wird, für den auch ein Alias ​​erstellt wurde, der auf die IP des neuen Servernamens umgeleitet wird.

Alle alten IIS-Apps funktionierten und wurden über den Alias ​​zum neuen Servernamen umgeleitet. Ich habe ahnungsvoll überprüft, ob SSRS ausgeführt wird. Der Versuch, eine Verbindung zur SSRS-Site herzustellen, ergab den folgenden Fehler:

"Der Dienst ist nicht verfügbar. Wenden Sie sich an Ihren Systemadministrator, um das Problem zu beheben. Systemadministratoren: Der Berichtsserver kann keine Verbindung zu seiner Datenbank herstellen. Stellen Sie sicher, dass die Datenbank ausgeführt wird und auf sie zugegriffen werden kann. Sie können auch das Ablaufverfolgungsprotokoll des Berichtsservers auf Details überprüfen . "

Es wurde auf dem Server ausgeführt, konnte jedoch keine Verbindung herstellen, da der Alias ​​für den alten Servernamen verwendet wurde. Durch Neukonfiguration von SSRS zur Verwendung des neuen Servernamens anstelle des alten / Alias ​​wurde dieser behoben.

SQLMonger
quelle
0
  1. Ändern Sie die App-Pool-Identität in Lokales System
  2. Unter SQL Mgmt> Sicherheit> Anmeldungen
    1. Doppelklicken Sie auf NT AUTHORITY \ SYSTEM
    2. Benutzerzuordnungen> Überprüfen Sie Ihre Datenbank und geben Sie ihr unten eine Rolle.
    3. Denken Sie auch daran, die Benutzerdatenbank für Sicherheitsanmeldungen mit einem korrekten Kennwort zu erstellen.
Allan Zeidler
quelle
0

Beim Versuch, eine Lösung mit den folgenden Methoden zu testen, ist dieser Fehler aufgetreten

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

Die Lösung war wie folgt: Ich musste Visual Studio öffnen und unter einem anderen Konto ausführen, da das Konto, das ich zum Öffnen verwendete, nicht mein Administratorkonto war.

Wenn Ihr Problem meinem ähnlich ist: Stecken Sie den VS in die Taskleiste, öffnen Sie das Menü mit Umschalttaste und Rechtsklick, damit Sie VS als anderen Benutzer öffnen können. Geben Sie hier die Bildbeschreibung ein

Live-Liebe
quelle
0

Schätzen Sie, dass es hier ein paar gute Antworten gibt, aber da ich gerade Zeit verloren habe, dies herauszufinden, kann dies hoffentlich jemandem helfen.

In meinem Fall hatte alles gut funktioniert und dann ohne ersichtlichen Grund mit dem in der Frage angegebenen Fehler gestoppt.

IIS wurde als Netzwerkdienst ausgeführt, und der Netzwerkdienst wurde zuvor auf SQL Server eingerichtet (siehe andere Antworten auf diesen Beitrag). Serverrollen und Benutzerzuordnungen sahen korrekt aus.

Das Problem war; aus absolut keinem offensichtlichen Grund; Der Netzwerkdienst hatte in der Datenbank auf "Anmelderechte verweigern" umgestellt.

Reparieren:

  1. Öffnen Sie SSMS> Sicherheit> Anmeldungen.
  2. Klicken Sie mit der rechten Maustaste auf "NT AUTHORITY \ NETWORK SERVICE" und klicken Sie auf "Eigenschaften".
  3. Gehen Sie zur Registerkarte 'Status' und setzen Sie Permission to Connect To Database Engineauf 'Grant'.

Netzwerkdienst zulässig

HockeyJ
quelle