2010-02-11 21 views
11

He programado un servicio de Windows en C# que debe conectarse a una base de datos SQL-Server 2005 Express con System.Data.SqlClient.Cómo conectarse a sql-server con la autenticación de Windows desde el servicio de Windows?

Como Microsoft prefiere usar la Autenticación de Windows sobre la Autenticación de SQL, traté de conectarme a la base de datos con Trusted Conenction/Integrated Security.

Sin embargo, eso no funciona ya que recibo una System.Data.SqlClient.SqlException: Falló el inicio de sesión para el usuario 'NT AUTHORITY \ LOCAL SERVICE'.

¿Es posible iniciar sesión con una cuenta de Windows diferente?

Respuesta

13

Por el momento, el servicio parece ejecutarse actualmente bajo el LocalService Account y esta cuenta de servicio no está autorizada actualmente en SQL.

La situación se puede solucionar de una de estas dos formas: ejecutar la cuenta con una cuenta autorizada en SQL o agregar la cuenta de Servicio local como un inicio de sesión en SQL. Específicamente:

  • Cambie la cuenta en la que se ejecuta el servicio como, en la consola de gestión del servicio. (por ejemplo: Servicios de Administración de Computadoras y Servicios | luego haga clic con el botón derecho para "Propiedades" en el servicio en cuestión)
  • Alternativamente, en "Microsoft SQL Management Studio", agregue la cuenta LSA como inicio de sesión y configure este nuevo principal (inicio de sesión) de forma que pueda acceder a los objetos de base de datos deseados.

Editar: El primer enfoque es probablemente preferible, porque la cuenta LocalService por lo que se encuentra omnipresente en el sistema que otorgarle acceso a SQL expondría SQL y las bases de datos sería un servicio o controlador particular usarlo verse en peligro .
En su lugar, al introducir una cuenta específica, uno tiene más control sobre quién accede a los objetos SQL y cómo. Por supuesto, esto trae el problema de configurar tal cuenta, con respecto a los privilegios que se deben otorgar, en el nivel del sistema (no de SQL), y dependiendo de lo que haga el Servicio subyacente, puede necesitar hacer que esta cuenta bastante poderoso, por lo tanto una responsabilidad potencial de otras maneras ...

+0

gracias. cambiar al usuario para el servicio suena bien. pero ¿cómo se puede hacer eso programáticamente? Quiero hacer eso en mi programa C# - no en la consola de administración de servicios. –

+0

@ räph: Hace un tiempo hubiera sugerido buscar en la API de ADSI, pero ahora usted debería poder "meterse con las cuentas" más fácilmente con la clase .NET System.ServiceProcess.ServiceController. Aunque utilizo esto para iniciar/detener servicios, nunca modifiqué la configuración de un servicio de esta manera. Otros enfoques que he visto están generando un comando de red (aunque no creo que cambiar el servicio sea posible de esa manera) y más recientemente con PowerShell (permite cambiar las propiedades de un servicio, aunque tampoco tengo experiencia con esto ... .). – mjv

+1

LSA significa * Local Security Authorithy *, no LocalService. http://msdn.microsoft.com/en-us/library/ms721592%28VS.85%29.aspx#_security_local_security_authority_gly#_security_local_security_authority_gly –

1

Debe otorgar acceso a la cuenta de SERVICIO LOCAL en SQL Express. Según mi comentario, mi consejo sería crear una cuenta nueva en la que se pueda ejecutar su servicio y luego agregar los permisos relevantes dentro de SQL Express, en otras palabras, no ejecute su servicio bajo SERVICIO LOCAL.

+1

Pensé en eso, pero ¿entonces no todos los servicios tendrían acceso a mi db? –

+0

Todos los servicios que se ejecutan bajo esa cuenta sí. Debe crear una cuenta separada y especificar solo los permisos que requiere. – James

2

Si desea utilizar la autenticación confiable de Windows, lo más fácil es ejecutar el servicio con una cuenta de dominio (con los menores privilegios necesarios) que está autorizada para la base de datos del servidor sql.

3

Cuando el Administrador de control de servicios inicia un servicio de Windows, el proceso se ejecuta como un usuario particular al igual que con cualquier otro proceso que se ejecute en el sistema operativo.

Existen varias cuentas de usuario "integradas" que se usan para ejecutar Servicios de Windows. Puede ver el conjunto completo de Servicios de Windows y la cuenta que ejecutan (llamado "Iniciar sesión como" en Windows 7) si mira el nodo "Servicios" dentro de Administración de equipos ".

Desde mi experiencia, cuando queremos un servicio de Windows para hablar con el PP utiliza seguridad integrada tomamos la segunda aproximación por debajo de:

1) Asignar una de las cuentas integradas como el "Iniciar sesión como" cuenta y agregue esta cuenta como un inicio de sesión en la instancia de SQL Server con los permisos DB apropiados

2) Use/cree una cuenta local o de dominio para el Servicio de Windows y luego agregue esta cuenta como inicio de sesión con la base de datos adecuada permisos Es posible a través del instalador solicitar las credenciales de la cuenta de usuario durante la instalación del servicio.

no puedo pretender ser lo suficientemente experto para señalar todos los pros y los contras de cada enfoque, sin embargo vale la pena considerar los siguientes:

  • con el enfoque 1 todos los servicios y procesos que se ejecutan como el seleccionado la cuenta integrada tendrá permiso para acceder a su base de datos. Este no es el caso con el acercamiento 2.

  • con el acercamiento 1 la configuración de contraseña es manejada por la máquina pero con la aproximación 2 la contraseña puede ser administrada por los administradores y también cumplir con las políticas de seguridad requeridas.

espero que esto ayude a

1

Como MJV dijo, es necesario o bien dará acceso a la cuenta de servicio local a la base de datos o utilizar una cuenta diferente para ejecutar el servicio. Usted preguntó cómo puede cambiar la cuenta mediante programación, lo que se logra creando un Instalador para el servicio y cambiando la propiedad de la Cuenta a "Usuario" y luego especificando el Nombre de usuario y la Contraseña para ejecutar el servicio.

El siguiente enlace contiene información sobre cómo crear el instalador si se desplaza a la parte inferior:

http://msdn.microsoft.com/en-us/library/aa984464(VS.71).aspx

Mientras que a continuación se ofrece un poco más de detalle acerca de la propiedad de la cuenta:

http://msdn.microsoft.com/en-us/library/system.serviceprocess.serviceprocessinstaller.account(VS.71).aspx

Espero que esto ayude.

Cuestiones relacionadas