Accesso non riuscito per l'utente "DOMAIN \ MACHINENAME $"


120

So che questo è quasi un duplicato di: L'errore "Accesso non riuscito per l'utente 'NT AUTHORITY \ IUSR'" in ASP.NET e SQL Server 2008 e Accesso non riuscito per l'utente 'nome utente' - System.Data.SqlClient.SqlException con LINQ in progetto esterno / libreria di classi ma alcune cose non si sommano rispetto ad altre applicazioni sul mio server e non sono sicuro del perché.

Scatole utilizzate:

Casella Web Box
SQL Casella di
prova SQL

La mia applicazione:

Ho un'applicazione Web ASP.NET, che fa riferimento a una libreria di classi che utilizza LINQ-to-SQL. Stringa di connessione impostata correttamente nella libreria di classi. Come per Accesso non riuscito per l'utente 'nome utente' - System.Data.SqlClient.SqlException con LINQ nella libreria di progetto / classe esterna, ho anche aggiunto questa stringa di connessione all'applicazione Web.

La stringa di connessione utilizza le credenziali SQL in questo modo (sia nell'app Web che nella libreria di classi):

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

Questa connessione è stata confermata come funzionante aggiungendola a Esplora server. Questa è la stringa di connessione utilizzata dal mio file .dbml.

Il problema:

Ottengo il seguente errore:

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

Ora fa riferimento a questo L'errore "Accesso non riuscito per l'utente 'NT AUTHORITY \ IUSR'" in ASP.NET e SQL Server 2008 dice che è davvero il servizio di rete locale e l'utilizzo di qualsiasi altro nome non di dominio non funzionerà.

Ma sono confuso perché ho controllato sia SQL Box che SQL Test Box SQL Management Studio ed entrambi hanno NT AUTHORITY/NETWORK SERVICEin Security -> Logins, a livello di database, che non è elencato in Security -> Users, ma a livello di database Security -> Utenti Ho l'utente visualizzato nella stringa di connessione.

A livello NTFS sul server web, le autorizzazioni hanno il SERVIZIO DI RETE ha il pieno controllo.

Il motivo per cui sono confuso è perché ho molte altre applicazioni Web sul mio server Web, che fanno riferimento a database sia su SQL Box che su SQL Test Box, e funzionano tutte. Ma non riesco a trovare una differenza tra loro e la mia attuale applicazione, a parte il fatto che sto usando una libreria di classi. Che importa? Il controllo delle autorizzazioni NTFS, la configurazione degli accessi di sicurezza a livello di server e database, stringa di connessione e metodo di connessione (credenziali di SQL Server), pool di applicazioni IIS e altre opzioni di cartella sono tutti uguali.

Perché queste applicazioni funzionano senza aggiungere il machinename $ alle autorizzazioni di una delle mie caselle SQL? Ma questo è ciò che l'unico collegamento mi dice di fare per risolvere questo problema.


Quindi, per ricapitolare, non stai utilizzando un utente di database? Ne creiamo uno e possiamo passare da esso a SA a seconda di cosa dobbiamo fare ...
jcolebrand

Nella stringa di connessione sto usando un utente del database, che ho creato nell'area Sicurezza -> Accessi, l'ho aggiunto a Sicurezza -> utenti del database e gli ho dato i permessi dbo. Ed è così che ho fatto anche tutte le mie altre app.
SventoryMang

Ecco una chiara spiegazione da MSDN utilizzando il nome del computer predefinito, in pratica aggiungi semplicemente il dominio / macchina $ a sql senza premere la ricerca. blogs.msdn.microsoft.com/ericparvin/2015/04/14/…
Brett Maiwald

Risposte:


156

NETWORK SERVICE e LocalSystem si autenticheranno sempre come l'account corrispondente localmente (builtin \ network service e builtin \ system) ma entrambi si autenticheranno come account della macchina in remoto.

Se vedi un errore del genere Login failed for user 'DOMAIN\MACHINENAME$'significa che un processo in esecuzione come SERVIZIO DI RETE o come Sistema Locale ha avuto accesso a una risorsa remota, si è autenticato come account della macchina e le è stata negata l'autorizzazione.

Un esempio tipico potrebbe essere un'applicazione ASP in esecuzione in un pool di app impostato per utilizzare le credenziali del SERVIZIO DI RETE e la connessione a un SQL Server remoto: il pool di app verrà autenticato come la macchina che esegue il pool di app ed è questo account del computer a cui deve essere concesso l'accesso .

Quando l'accesso viene negato a un account macchina, l'accesso deve essere concesso all'account macchina. Se il server rifiuta di accedere a "DOMAIN \ MACHINE $", è necessario concedere i diritti di accesso a "DOMAIN \ MACHINE $" e non a SERVIZIO DI RETE. La concessione dell'accesso a NETWORK SERVICE consentirebbe a un processo locale in esecuzione come NETWORK SERVICE di connettersi, non remoto, poiché quello remoto si autenticherà come, hai indovinato, DOMAIN \ MACHINE $.

Se si prevede che l'applicazione asp si connetta a SQL Server remoto come account di accesso SQL e si ottengono eccezioni su DOMAIN \ MACHINE $, significa che si utilizza la sicurezza integrata nella stringa di connessione. Se questo è inaspettato, significa che hai sbagliato le stringhe di connessione che usi.


2
Giusto quello che avevo raccolto, grazie per la spiegazione. Tuttavia, la domanda rimane ancora, tutte le mie app sono ospitate sul mio Web Server ma accedono a un database su SQL o SQL Test box, quello sarebbe un accesso remoto sì? Eppure stanno funzionando ... ma nessuna delle mie caselle SQL sta concedendo l'accesso a DOMAIN \ MACHINENAME $.
SventoryMang

1
Oh Inoltre, mi aspetto di connettermi al server SQL come login SQL ma ho pubblicato le mie stringhe di connessione, non sto usando l'opzione Integrated Security = True, cos'altro potrebbe essere ??
SventoryMang

2
Ci sono tre possibili spiegazioni: 1) usano l'autenticazione SQL invece dell'autenticazione integrata (che sembra essere la più plausibile, dal momento che l'esempio ha un ID utente e una password nella stringa conn) 2) usano l'autenticazione integrata e vengono eseguiti in un sondaggio dell'app che utilizza una credenziale diversa o 3) utilizzano l'autenticazione integrata ma l'app ASP rappresenta il chiamante, attivando così la delega vincolata: technet.microsoft.com/en-us/library/cc739587%28WS.10%29.aspx .
Remus Rusanu

2
Il progetto dell'app Web deve fare riferimento al progetto della libreria di classi , non alla dll. Aggiungere il progetto della libreria di classi alla soluzione dell'app Web, quindi rimuovere il riferimento alla dll e aggiungere il riferimento al progetto. In questo modo, durante la distribuzione o il test, l'app Web di vendita al dettaglio farà riferimento alla DLL della classe di vendita al dettaglio e il debug farà riferimento al debug, automaticamente.
Remus Rusanu

1
Anche se va tutto bene, come si aggiunge il login della macchina a SQL? - Sono entrambi sullo stesso dominio e preferirei utilizzare la sicurezza integrata. Ma la semplice aggiunta di un account denominato "Domain \ MachineName $" fallisce completamente (ad esempio, non esiste, e Object Explorer si blocca e non riesce a trovare nulla del genere).
BrainSlugs83

33

Questo errore si verifica dopo aver configurato l'applicazione con IIS e IIS passa a SQL Server e tenta di accedere con credenziali che non dispongono delle autorizzazioni appropriate. Questo errore può verificarsi anche durante la configurazione della replica o del mirroring. Esaminerò una soluzione che funziona sempre ed è molto semplice. Vai a SQL Server >> Sicurezza >> Login e fai clic con il tasto destro su NT AUTHORITY \ NETWORK SERVICE e seleziona Proprietà

Nella schermata appena aperta delle proprietà di accesso, vai alla scheda "Mappatura utente". Quindi, nella scheda "Mappatura utente", selezionare il database desiderato, in particolare il database per il quale viene visualizzato questo messaggio di errore. Nella schermata inferiore, controlla il ruolo db_owner. Fare clic su OK.


7
Questa è stata la soluzione per me poiché l'applicazione Web e il database si trovano sulla stessa macchina. Ho ancora ricevuto l'errore "Accesso non riuscito per l'utente" DOMINIO \ NOME MACCHINA $ "ma l'aggiunta della macchina agli accessi SQL non ha aiutato, ma l'aggiunta di" NT AUTHORITY \ NETWORK SERVICE "sì. Sebbene non si debba usare il ruolo db_owner a meno che non sia necessario, normalmente db_datareader e db_datawriter sono sufficienti.
Jimi Svezia,

18

Nel mio caso ho avuto Identity="ApplicationPoolIdentity"per il mio pool di applicazioni IIS.

Dopo aver aggiunto l' IIS APPPOOL\ApplicationNameutente a SQL Server, funziona.


5
Credo che questo funzionerà solo se IIS e il server SQL si trovano sulla stessa macchina.
Rob Davis

1
Questo ha funzionato per me! Ho una configurazione del server IIS-SQL locale.
Vin Shahrdar

1
Grazie mille. Questo problema è iniziato per me dopo aver aggiornato il mio ambiente di sviluppo locale da SQL Server 2014 a 2017. Il tuo suggerimento è stato il proiettile d'argento in questa situazione.
MFry

Grazie, ha funzionato anche per me. Quello che vorrei evidenziare è che il messaggio di errore è ancora "Accesso non riuscito per l'utente" DOMAIN \ MACHINENAME $ "anche se il pool di applicazioni è impostato per essere eseguito con l'identità del pool e l'accesso non riesce anche se" DOMAIN \ MACHINENAME $ "in realtà viene concesso il permesso di connettersi. Mi sembra un messaggio di errore fuorviante.
mivra

16

Fondamentalmente per risolvere questo problema dobbiamo avere alcune impostazioni simili

  • App Web in esecuzione in ApplicationPoolIdentity
  • Applicazione Web che si connette ai database tramite ADO.Net utilizzando l'autenticazione di Windows nella stringa di connessione

La stringa di connessione utilizzata con l'autenticazione di Windows include l' Trusted_Connection=Yesattributo o l'attributo equivalente Integrated Security=SSPInel Web.configfile

La mia connessione al database è in modalità di autenticazione di Windows. Quindi l'ho risolto semplicemente cambiando l' identità del pool di applicazioni da ApplicationPoolIdentity alle credenziali di accesso al mio dominio DomainName \ MyloginId

Passo:

  1. Fare clic su Pool di applicazioni
  2. Seleziona il nome della tua applicazione

  3. Vai a Impostazioni avanzate

  4. Espandere Modello di processo e fare clic su Identità . Fare clic su tre punti all'estremità destra.
  5. Fare clic sul pulsante Imposta ... e fornire le credenziali di accesso al dominio

Per me è stato risolto.

Nota: in ambiente di produzione o IT, potresti avere un account di servizio sotto lo stesso dominio per l'identità del pool di app. In tal caso, utilizza l'account di servizio invece del tuo login.


Per la domanda precedente questa dovrebbe essere la risposta accettata.
Makil

14

Il trucco che ha funzionato per me è stato quello di rimuovere Integrated Securitydalla mia stringa di connessione e aggiungere una normale User ID=userName; Password=passwordstringa di connessione nella App.configtua libreria potrebbe non utilizzare la sicurezza integrata, ma quella creata in Web.configè!


3
Un miliardo di grazie a te. Enorme, enorme aiuto. Grazie, grazie, grazie. Questo è, ne sono sicuro, molto ovvio ma per i futuri, è User Id = qualcosa; Password = qualcosa;
shubniggurath

2
Ho ricevuto lo stesso errore nel titolo del post. Ho scoperto che "User Id = yourUserid Password = yourPassword" viene ignorato quando "'trusted connection = true'" è nella stringa di connessione del database. Ho rimosso "'trusted connection = true'" dalla mia stringa e questo ha risolto il mio problema. Ciò non è accaduto fino a quando non ho spostato l'applicazione dal debug in VS 2012 a iis 8.
T3.0

12

Un collega ha riscontrato lo stesso errore ed era dovuto a un piccolo errore di configurazione in IIS.
È stato assegnato il pool di applicazioni errato per l'applicazione Web.

Infatti utilizziamo un pool di applicazioni personalizzato con un'identità specifica per soddisfare le nostre esigenze.

Nel suo gestore IIS locale -> Siti -> Sito Web predefinito -> Nome della nostra applicazione Web -> Impostazioni di base ... Il pool di applicazioni era "DefaultAppPool" invece del nostro pool di applicazioni personalizzato.

L'impostazione del pool di applicazioni corretto ha risolto il problema.


11

Ho aggiunto <identity impersonate="true" />al mio web.config e ha funzionato bene.


7
Basta capire che questo cambierà il contesto per cui viene eseguita l'applicazione ASP.NET nella sua interezza. Invece di essere eseguito nel contesto predefinito "SERVIZIO DI RETE", ora verrà eseguito nel contesto dell'utente che utilizza l'applicazione (ad esempio Dominio \ utente). A volte va bene, ma devi solo capire che questa modifica non è solo una soluzione rapida all'OP e ha altre implicazioni a valle che potrebbero / non potrebbero essere desiderate.
atconway


6

Per me il problema è stato risolto quando ho sostituito l'account predefinito predefinito "ApplicationPoolIdentity" con un account di rete a cui era consentito l'accesso al database.

Le impostazioni possono essere effettuate in Internet Information Server (IIS 7+)> Pool di applicazioni> Impostazioni avanzate> Modello di processo> Identità


4

Per me il problema con "DOMAIN \ MACHINENAME $" è stato risolto impostando DefaultApplicationPoolIdentity su NetworkService.

inserisci qui la descrizione dell'immagine


3

Abbiamo ricevuto messaggi di errore simili durante l'elaborazione di un database di Analysis Services. Si è scoperto che il nome utente, utilizzato per eseguire l'istanza di Analysis Services, non era stato aggiunto agli accessi di sicurezza di SQL Server.

In SQL Server 2012, i servizi SQL Server e Analysis sono configurati per essere eseguiti come utenti diversi per impostazione predefinita. Se sei andato con le impostazioni predefinite, assicurati sempre che l'utente AS abbia accesso alla tua origine dati!


1
Ho avuto lo stesso problema. L'errore di SSAS è lo stesso, ma l'account non è il servizio di rete. L'account è effettivamente: NT Service \ MSOLAP $ INSTANCENAME
cdonner

2

Controlla se ce l'hai

User Instance=true

nella stringa di connessione. Prova a rimuoverlo per risolvere il tuo problema.


2

Ho anche avuto questo errore con un utente autenticato di SQL Server

Ho provato alcune delle soluzioni, ma non hanno funzionato.

La soluzione nel mio caso è stata configurare la "Modalità di autenticazione del server" per consentire l'autenticazione di SQL Server, in Management Studio: Proprietà / Sicurezza.


1

L'unico punto che tutti sembrano aver trascurato è che potresti volere sicurezza integrata = vero. Il sito potrebbe essere in esecuzione con un account pool. Va tutto bene, quindi è ancora possibile colpire il server SQL con le credenziali utente originali e non con quelle del pool. Si chiama delega vincolata. Se lo abiliti e imposti un SPN, Windows tradurrà le credenziali del pool con le richieste dell'utente che vanno al servizio finale (SQL è solo uno di questi servizi). È necessario registrare l'UNICO server SQL che serve le richieste SQL sul server web. Impostare tutto questo è troppo per me per cercare di descriverlo accuratamente qui. Mi ci è voluto un po 'per risolverlo da solo.


0

Ho passato alcune ore a cercare di risolvere il problema e finalmente l'ho capito: il browser SQL Server era "arrestato". La soluzione è cambiarlo in modalità "Automatica":

Se è disabilitato, vai su Pannello di controllo-> Strumenti di amministrazione-> Servizi e cerca SQL Server Agent. Fare clic con il pulsante destro del mouse e selezionare "Proprietà". Dal menu a discesa "Tipo di avvio", cambia da "Disabilitato" a "Automatico".

citazione da qui


0

Ho avuto lo stesso problema in precedenza, la rimozione Persist Security Info=Trueda connectiontring ha funzionato per me.


0

Ho riscontrato questo problema quando un client ha rinominato SQL Server. L'SQL Reporting Service era configurato per connettersi al vecchio nome del server, per il quale avevano anche creato un alias per quello reindirizzato all'IP del nuovo nome del server.

Tutte le loro vecchie app IIS funzionavano, reindirizzando al nuovo nome del server tramite l'alias. Per un sospetto, ho controllato se stavano eseguendo SSRS. Il tentativo di connettersi al sito SSRS ha restituito l'errore:

"Il servizio non è disponibile. Contattare l'amministratore di sistema per risolvere il problema. Amministratori di sistema: il server di report non può connettersi al proprio database. Verificare che il database sia in esecuzione e accessibile. È inoltre possibile controllare il registro di traccia del server di report per i dettagli . "

Era in esecuzione sul server, ma non riusciva a connettersi perché utilizzava l'alias per il vecchio nome del server. La riconfigurazione di SSRS per utilizzare il nuovo nome del server invece del vecchio / alias lo ha risolto.


0
  1. Cambia l'identità del pool di app in Sistema locale
  2. In SQL Mgmt> Sicurezza> Login
    1. Trova NT AUTHORITY \ SYSTEM doppio clic
    2. Mappature utente> Controlla il tuo database e assegnagli un ruolo di seguito.
    3. Ricordarsi inoltre di creare il database degli utenti o login di sicurezza con una password corretta.

0

Ho ricevuto questo errore cercando di testare una soluzione utilizzando quanto segue

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

Il modo in cui ho risolto è stato: ho dovuto aprire Visual Studio ed eseguirlo con un altro account, perché l'account che stavo usando per aprire non era il mio account di amministratore.

Quindi, se il tuo problema è simile al mio: aggiungi il VS alla barra delle applicazioni, quindi usa Maiusc e clic destro per aprire il menu in modo da poter aprire VS come un altro utente. inserisci qui la descrizione dell'immagine


0

Apprezzo che ci siano alcune buone risposte qui, ma poiché ho appena perso tempo per risolverlo, spero che questo possa aiutare qualcuno.

Nel mio caso, tutto stava funzionando bene, poi si è fermato senza motivo apparente con l'errore indicato nella domanda.

IIS era in esecuzione come servizio di rete e il servizio di rete era stato impostato in precedenza su SQL Server (vedere altre risposte a questo post). I ruoli del server e le mappature degli utenti sembravano corretti.

Il problema era; per nessuna ragione apparente; Il servizio di rete è passato ai diritti di accesso "Nega" nel database.

Aggiustare:

  1. Apri SSMS> Sicurezza> Accessi.
  2. Fare clic con il tasto destro su "NT AUTHORITY \ NETWORK SERVICE" e fare clic su Proprietà.
  3. Vai alla scheda "Stato" e imposta Permission to Connect To Database Engine"Concedi".

Servizio di rete consentito

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.