Error de inicio de sesión para el usuario "DOMAIN \ MACHINENAME $"

120

Sé que esto es casi un duplicado de: El error "Error de inicio de sesión para el usuario 'NT AUTHORITY \ IUSR'" en ASP.NET y SQL Server 2008 y error de inicio de sesión para el usuario 'nombre de usuario' - System.Data.SqlClient.SqlException con LINQ en Proyecto externo / biblioteca de clases, pero algunas cosas no cuadran en comparación con otras aplicaciones en mi servidor y no estoy seguro de por qué.

Cajas que se utilizan:

Caja web Caja
SQL Caja de
prueba SQL

Mi aplicación:

Tengo una aplicación web ASP.NET, que hace referencia a una biblioteca de clases que usa LINQ-to-SQL. Cadena de conexión configurada correctamente en la biblioteca de clases. Según el inicio de sesión fallido para el usuario 'nombre de usuario' - System.Data.SqlClient.SqlException con LINQ en un proyecto externo / biblioteca de clases , también agregué esta cadena de conexión a la aplicación web.

La cadena de conexión usa credenciales SQL como tal (tanto en la aplicación web como en la biblioteca de clases):

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

Se confirmó que esta conexión funciona al agregarla al Explorador de servidores. Esta es la cadena de conexión que usa mi archivo .dbml.

El problema:

Obtuve el siguiente error:

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

Ahora haciendo referencia a esto el error "Error de inicio de sesión para el usuario 'NT AUTHORITY \ IUSR'" en ASP.NET y SQL Server 2008 dice que es realmente el servicio de red local y que el uso de cualquier otro nombre que no sea de dominio no funcionará.

Pero estoy confundido porque he marcado SQL Box y SQL Test Box SQL Management Studio y ambos tienen NT AUTHORITY/NETWORK SERVICE en Seguridad -> Inicios de sesión, en el nivel de la base de datos, que no aparece en Seguridad -> Usuarios, pero en el nivel de la base de datos Seguridad -> Usuarios Tengo el usuario mostrado en la cadena de conexión.

A nivel NTFS en el servidor web, los permisos tienen el SERVICIO DE RED tiene control total.

La razón por la que estoy confundido es porque tengo muchas otras aplicaciones web en mi servidor web, que hacen referencia a bases de datos tanto en SQL Box como en SQL Test Box, y todas funcionan. Pero no puedo encontrar una diferencia entre ellos y mi aplicación actual, aparte de que estoy usando una biblioteca de clases. ¿Importará eso? La verificación de los permisos NTFS, la configuración de los inicios de sesión de seguridad en los niveles del servidor y de las bases de datos, la cadena de conexión y el método de conexión (credenciales de SQL Server), el grupo de aplicaciones IIS y otras opciones de carpeta son todos iguales.

¿Por qué estas aplicaciones funcionan sin agregar el nombre de máquina $ a los permisos de cualquiera de mis cuadros SQL? Pero eso es lo que me dice el enlace para solucionar este problema.

SventoryMang
fuente
Entonces, para recapitular, ¿no está utilizando un usuario de base de datos? Creamos uno y podemos alternar entre él y SA dependiendo de lo que necesitemos hacer ...
jcolebrand
En la cadena de conexión estoy usando un usuario de base de datos, que creé en el área Seguridad -> Inicios de sesión, lo agregué a Seguridad -> usuarios de la base de datos y le di permisos dbo. Así es como hice todas mis otras aplicaciones también.
SventoryMang
Aquí hay una explicación clara de MSDN usando el nombre de máquina predeterminado, básicamente, simplemente agrega el dominio / máquina $ a sql sin presionar buscar. blogs.msdn.microsoft.com/ericparvin/2015/04/14/…
Brett Maiwald

Respuestas:

156

NETWORK SERVICE y LocalSystem se autenticarán siempre como la cuenta correspondiente localmente (servicio de red incorporado y sistema incorporado) pero ambos se autenticarán como la cuenta de la máquina de forma remota.

Si ves un fracaso como Login failed for user 'DOMAIN\MACHINENAME$' , significa que un proceso que se ejecuta como SERVICIO DE RED o como LocalSystem ha accedido a un recurso remoto, se ha autenticado a sí mismo como la cuenta de la máquina y se le negó la autorización.

Un ejemplo típico sería una aplicación ASP que se ejecuta en un grupo de aplicaciones configurado para usar la credencial de SERVICIO DE RED y conectarse a un servidor SQL remoto: el grupo de aplicaciones se autenticará como la máquina que ejecuta el grupo de aplicaciones, y esta cuenta de máquina debe tener acceso .

Cuando se deniega el acceso a una cuenta de máquina, se debe otorgar acceso a la cuenta de máquina. Si el servidor se niega a iniciar sesión en 'DOMINIO \ MÁQUINA $', debe otorgar derechos de inicio de sesión a 'DOMINIO \ MÁQUINA $', no al SERVICIO DE RED. Otorgar acceso al SERVICIO DE RED permitiría a un local que se conectara proceso se ejecuta como SERVICIO DE RED, no uno remoto, ya que el remoto se autenticará como, supuso, DOMINIO \ MÁQUINA $.

Si espera que la aplicación asp se conecte al SQL Server remoto como un inicio de sesión SQL y obtiene excepciones sobre DOMINIO \ MÁQUINA $, significa que usa Seguridad integrada en la cadena de conexión. Si esto es inesperado, significa que arruinó las cadenas de conexión que usa.

Remus Rusanu
fuente
2
Eso es lo que recogí, gracias por la explicación. Sin embargo, la pregunta aún permanece, todas mis aplicaciones están alojadas en mi servidor web pero acceden a una base de datos en SQL o cajas de prueba SQL, eso sería acceso remoto, ¿sí? Sin embargo, están funcionando ... pero ninguno de mis cuadros SQL otorga acceso DOMAIN \ MACHINENAME $.
SventoryMang
1
Oh, también, espero conectarme al servidor SQL como un inicio de sesión de SQL pero he publicado mis cadenas de conexión, no estoy usando la opción Integrated Security = True, ¿qué más podría ser?
SventoryMang
2
Hay tres explicaciones posibles: 1) usan autenticación SQL en lugar de autenticación integrada (que parece ser la más plausible, ya que su ejemplo tiene un ID de usuario y contraseña en la cadena de conexión) 2) usan autenticación integrada y se ejecutan en una encuesta de aplicación que usa una credencial diferente o 3) usan autenticación integrada pero la aplicación ASP se hace pasar por la persona que llama, lo que activa la delegación restringida: technet.microsoft.com/en-us/library/cc739587%28WS.10%29.aspx .
Remus Rusanu
2
Su proyecto de aplicación web debe hacer referencia al proyecto de biblioteca de clases , no al dll. Agregue el proyecto de biblioteca de clases a la solución de la aplicación web, luego elimine la referencia a la dll y agregue la referencia al proyecto. De esta forma, al implementar o probar, la aplicación web minorista hará referencia a la clase dll minorista y la depuración hará referencia a la depuración, automáticamente.
Remus Rusanu
1
Si bien todo esto está muy bien, ¿cómo agrega el inicio de sesión de la máquina a SQL? - Ambos están en el mismo dominio y preferiría usar seguridad integrada. Pero el simple hecho de agregar una cuenta llamada "Domain \ MachineName $" falla por completo (como, no existe, y el explorador de objetos se ahoga y no encuentra nada parecido).
BrainSlugs83
33

Este error ocurre cuando ha configurado su aplicación con IIS, e IIS va a SQL Server e intenta iniciar sesión con credenciales que no tienen los permisos adecuados. Este error también puede ocurrir cuando se configura la replicación o el reflejo. Voy a repasar una solución que siempre funciona y es muy simple. Vaya a SQL Server >> Seguridad >> Inicio de sesión y haga clic derecho en NT AUTHORITY \ NETWORK SERVICE y seleccione Propiedades

En la pantalla recién abierta de Propiedades de inicio de sesión, vaya a la pestaña "Asignación de usuarios". Luego, en la pestaña "Asignación de usuarios", seleccione la base de datos deseada, especialmente la base de datos para la que se muestra este mensaje de error. En la pantalla inferior, marque el rol db_owner. Haga clic en Aceptar.

Zain Ali
fuente
7
Esta fue la solución para mí, ya que la aplicación web y la base de datos están en la misma máquina. Sigo recibiendo el error "Error de inicio de sesión para el usuario 'DOMINIO \ NOMBRE DE MÁQUINA $", pero agregar la máquina a los inicios de sesión de SQL no ayudó, pero agregar "NT AUTHORITY \ NETWORK SERVICE" sí. Aunque no debe utilizar el rol db_owner a menos que sea necesario, normalmente db_datareader y db_datawriter son suficientes.
JimiSweden
18

En mi caso tuve Identity="ApplicationPoolIdentity" para mi grupo de aplicaciones IIS.

Después de agregar un IIS APPPOOL\ApplicationNameusuario a SQL Server, funciona.

nZeus
fuente
5
Creo que esto solo funcionará si IIS y el servidor SQL están en la misma máquina.
Rob Davis
1
¡Esto funcionó para mí! Tengo una configuración de servidor IIS-SQL local.
Vin Shahrdar
1
Muchas gracias. Este problema comenzó para mí después de actualizar mi entorno de desarrollo local de SQL Server 2014 a 2017. Su sugerencia fue la solución mágica en esta situación.
Lunes
Gracias, también funcionó para mí. Lo que me gustaría resaltar es que el mensaje de error sigue siendo 'Error de inicio de sesión para el usuario' DOMAIN \ MACHINENAME $ 'a pesar de que el grupo de aplicaciones está configurado para ejecutarse con la identidad del grupo y el inicio de sesión falla incluso si el' DOMAIN \ MACHINENAME $ 'en realidad tiene los permisos para conectarse. Me parece un mensaje de error engañoso.
mivra
16

Básicamente, para resolver esto, necesitamos configurar algunos como

  • Aplicación web que se ejecuta en ApplicationPoolIdentity
  • Aplicación web que se conecta a bases de datos a través de ADO.Net utilizando la autenticación de Windows en la cadena de conexión

La cadena de conexión utilizada con la autenticación de Windows incluye un Trusted_Connection=Yesatributo o el atributo equivalente Integrated Security=SSPIen el Web.configarchivo

Mi conexión a la base de datos está en modo de autenticación de Windows. Así que decidí que simplemente cambiando los grupos de aplicaciones de identidad de ApplicationPoolIdentity a mi registro de dominio en las credenciales de dominio \ myloginid

Paso:

  1. Haga clic en Grupos de aplicaciones
  2. Seleccione el nombre de su aplicación

  3. Ir a Configuración avanzada

  4. Expanda Modelo de proceso y haga clic en Identidad . Haga clic en tres puntos en el extremo derecho.
  5. Haga clic en el botón Establecer ... y proporcione las credenciales de inicio de sesión de su dominio

Para mí estaba resuelto.

Nota: En el entorno de producción o de TI, es posible que tenga una cuenta de servicio en el mismo dominio para la identidad del grupo de aplicaciones. Si es así, use la cuenta de servicio en lugar de su inicio de sesión.

Raj Baral
fuente
Para la pregunta anterior, esta debería ser la respuesta aceptada.
makil
14

El truco que funcionó para mí fue eliminar Integrated Securityde mi cadena de conexión y agregar una User ID=userName; Password=passwordcadena de conexión regular en la App.configde su biblioteca. ¡Es posible que no esté usando seguridad integrada, pero la creada en sí Web.config!

winy101
fuente
3
Mil millones de agradecimientos para ti. Enorme, gran ayuda. Gracias, gracias, gracias. Esto es, estoy seguro, muy obvio, pero para la gente futura, es User Id = algo; Contraseña = algo;
shubniggurath
2
Recibí el mismo error en el título de la publicación. Encontré que la 'Id. De usuario = yourUserid Password = yourPassword' se ignora cuando "'conexión confiable = verdadera'" está en la cadena de conexión de la base de datos. Eliminé "'conexión confiable = verdadera'" de mi cadena y eso solucionó mi problema. Esto no sucedió hasta que moví la aplicación de depuración en VS 2012 a iis 8.
T3.0
12

Un colega tuvo el mismo error y se debió a un pequeño error de configuración en IIS.
Se asignó el grupo de aplicaciones incorrecto para la aplicación web.

De hecho, utilizamos un grupo de aplicaciones personalizado con una identidad específica para satisfacer nuestras necesidades.

En su IIS Manager local -> Sitios -> Sitio web predeterminado -> Nombre de nuestra aplicación web -> Configuración básica ... El grupo de aplicaciones era "DefaultAppPool" en lugar de nuestro grupo de aplicaciones personalizado.

Establecer el grupo de aplicaciones correcto resolvió el problema.

Julien P
fuente
11

Agregué <identity impersonate="true" />a mi web.config y funcionó bien.

simonm
fuente
7
Solo comprenda que esto cambiará el contexto para el que se ejecuta la aplicación ASP.NET en su totalidad. En lugar de ejecutarse en el contexto predeterminado de 'SERVICIO DE RED', ahora se ejecutará en el contexto del usuario que usa la aplicación (es decir, Dominio \ algún usuario). Esto está bien a veces, pero comprenda que este cambio no es solo una solución rápida para el OP y tiene otras implicaciones posteriores que pueden o no desear.
atconway
6

Para mí, el problema se resolvió cuando reemplacé la cuenta incorporada predeterminada 'ApplicationPoolIdentity' con una cuenta de red a la que se le permitió el acceso a la base de datos.

La configuración se puede realizar en Internet Information Server (IIS 7+)> Grupos de aplicaciones> Configuración avanzada> Modelo de proceso> Identidad

Remco
fuente
4

Para mí, el problema con 'DOMAIN \ MACHINENAME $' se solucionó configurando DefaultApplicationPoolIdentity en NetworkService.

ingrese la descripción de la imagen aquí

Arsen Khachaturyan
fuente
3

Recibíamos mensajes de error similares al procesar una base de datos de Analysis Services. Resultó que el nombre de usuario, que se utilizó para ejecutar la instancia de Analysis Services, no se había agregado a los inicios de sesión de seguridad de SQL Server.

En SQL Server 2012, los servicios de SQL Server y Analysis están configurados para ejecutarse como usuarios diferentes de forma predeterminada. Si ha optado por los valores predeterminados, asegúrese siempre de que el usuario AS tenga acceso a su fuente de datos.

Philip Atz
fuente
1
Yo tuve el mismo problema. El error de SSAS es el mismo, pero la cuenta no es Servicio de red. La cuenta es en realidad: NT Service \ MSOLAP $ INSTANCENAME
cdonner
2

Comprueba si tienes

User Instance=true

en cadena de conexión. Intente eliminarlo, lo que resolverá su problema.

Sarath Avanavu
fuente
2

También tuve este error con un usuario autenticado de SQL Server

Probé algunas de las correcciones, pero no funcionaron.

La solución en mi caso fue configurar su "Modo de autenticación de servidor" para permitir la autenticación de SQL Server, en Management Studio: Propiedades / Seguridad.

Arjan
fuente
1

El único punto que todo el mundo parece haber pasado por alto es que es posible que desee seguridad integrada = verdadero. Es posible que el sitio se ejecute en una cuenta de grupo. Todo está bien y todavía es posible acceder al servidor SQL con la credencial de usuario original y no con la del grupo. Se llama delegación restringida. Si lo habilita y configura un SPN, las ventanas traducirán las credenciales del grupo con las solicitudes del usuario que van al servicio final (SQL es solo uno de esos servicios). Debe registrar el ÚNICO servidor SQL que atiende las solicitudes SQL en el servidor web. Configurar todo esto es demasiado para intentar describirlo aquí con precisión. Me tomó bastante tiempo resolverlo yo mismo.

Todd Beaulieu
fuente
0

Pasé algunas horas tratando de solucionar el problema y finalmente lo entendí: el navegador de SQL Server estaba "detenido". La solución es cambiarlo al modo "Automático":

Si está deshabilitado, vaya a Panel de control-> Herramientas administrativas-> Servicios y busque el Agente SQL Server. Haga clic derecho y seleccione "Propiedades". En el menú desplegable "Tipo de inicio", cambie de "Deshabilitado" a "Automático".

cita de aquí

Un Petrov
fuente
0

Tuve el mismo problema antes, la eliminación Persist Security Info=Truede la cadena de conexión funcionó para mí.

msk
fuente
0

Me encontré con este problema cuando un cliente cambió el nombre de SQL Server. El servicio de informes SQL se configuró para conectarse al nombre del servidor anterior, para el cual también habían creado un alias para que se redirigiera a la IP del nuevo nombre del servidor.

Todas sus antiguas aplicaciones IIS estaban funcionando, redirigiendo al nuevo nombre del servidor a través del alias. Por una corazonada, verifiqué si estaban ejecutando SSRS. Intentar conectarse al sitio SSRS produjo el error:

"El servicio no está disponible. Comuníquese con el administrador del sistema para resolver el problema. Administradores del sistema: el servidor de informes no puede conectarse a su base de datos. Asegúrese de que la base de datos esté en ejecución y accesible. También puede consultar el registro de seguimiento del servidor de informes para obtener más detalles . "

Se estaba ejecutando en el servidor, pero no se podía conectar porque estaba usando el alias del nombre del servidor anterior. La reconfiguración de SSRS para usar el nuevo nombre del servidor en lugar del antiguo / alias lo solucionó.

SQLMonger
fuente
0
  1. Cambiar la identidad del grupo de aplicaciones a sistema local
  2. En SQL Mgmt> Seguridad> Inicios de sesión
    1. Busque NT AUTHORITY \ SYSTEM haga doble clic
    2. Asignaciones de usuarios> Verifique su base de datos y asígnele un rol a continuación.
    3. Recuerde también crear la base de datos de usuario o inicios de sesión de seguridad con una contraseña correcta.
Allan Zeidler
fuente
0

Recibí este error al intentar probar una solución usando lo siguiente

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

La forma en que resolví fue: tuve que abrir Visual Studio y ejecutarlo con otra cuenta, porque la cuenta que estaba usando para abrir no era mi cuenta de administrador.

Entonces, si su problema es similar al mío: fije el VS a la barra de tareas, luego use Mayús y haga clic con el botón derecho para abrir el menú para que pueda abrir VS como otro usuario. ingrese la descripción de la imagen aquí

vive el amor
fuente
0

Aprecio que hay algunas buenas respuestas aquí, pero como acabo de perder tiempo resolviendo esto, espero que esto pueda ayudar a alguien.

En mi caso, todo había estado funcionando bien, luego se detuvo sin razón aparente con el error indicado en la pregunta.

IIS se estaba ejecutando como servicio de red y el servicio de red se había configurado anteriormente en SQL Server (consulte otras respuestas a esta publicación). Los roles de servidor y las asignaciones de usuarios parecían correctos.

El problema era; sin ninguna razón aparente; El servicio de red había cambiado a "Denegar" los derechos de inicio de sesión en la base de datos.

Arreglar:

  1. Abra SSMS> Seguridad> Inicios de sesión.
  2. Haga clic con el botón derecho en 'NT AUTHORITY \ NETWORK SERVICE' y haga clic en Propiedades.
  3. Vaya a la pestaña 'Estado' y establezca en Permission to Connect To Database Engine'Otorgar'.

Servicio de red permitido

HockeyJ
fuente