2010-02-11 25 views
11

Ho programmato un servizio Windows in C# che dovrebbe connettersi a un database SQL Server 2005 Express con System.Data.SqlClient.Come connettersi a SQL Server con l'autenticazione di Windows da Windows-Service?

Poiché Microsoft preferisce utilizzare l'autenticazione di Windows tramite l'autenticazione di SQL, ho provato a connettermi al DB con Trusted Conenction/Integrated Security.

Tuttavia ciò non funziona in quanto ottengo un System.Data.SqlClient.SqlException: accesso non riuscito per l'utente 'NT AUTHORITY \ LOCAL SERVICE'.

È possibile accedere con un account Windows diverso?

risposta

13

Al momento, il servizio sembra attualmente eseguito con il numero LocalService Account e questo account di servizio non è attualmente autorizzato su SQL.

La situazione può essere risolta in due modi: eseguendo l'account con un account autorizzato in SQL o aggiungendo l'account LocalService come accesso in SQL. In particolare:

  • Modificare quale account viene eseguito il servizio come, nella console di gestione del servizio. (es .: Gestione computer | Servizi e applicazioni | Servizi quindi fare clic con il pulsante destro del mouse su "Proprietà" sul servizio in questione)
  • In alternativa, in "Microsoft SQL Management Studio", aggiungere l'account LSA come account di accesso e impostare questo nuovo principal (login) in modo che possa accedere agli oggetti del database desiderati.

Edit: Il primo approccio è probabilmente preferibile, perché l'account LocalService è così pervasivamente trovato nel sistema che concede l'accesso a SQL esporrebbe SQL ei database sarebbe un particolare servizio o driver utilizzando diventa compromessa .
Invece introducendo un account specifico si ha più controllo su chi accede agli oggetti SQL e come. Questo ovviamente porta il problema della configurazione di un account di questo tipo, per quanto riguarda i privilegi che dovrebbe essere concesso, a livello di sistema (non di SQL) e, a seconda di ciò che fa il servizio sottostante, potrebbe dover rendere questo account piuttosto potente, quindi una potenziale responsabilità in altri modi ....

+0

grazie. cambiare l'utente per il servizio suona bene. ma come può essere fatto programmaticamente? Voglio farlo nel mio programma C# - non nella console di gestione del servizio .. –

+0

@ räph: Qualche tempo fa avrei suggerito di guardare nell'API ADSI, ma ora dovresti essere in grado di "fare casino con gli account" più facilmente con la classe .NET System.ServiceProcess.ServiceController. Sebbene io lo usi per avviare/fermare i servizi, non ho mai modificato le impostazioni di un servizio in questo modo. Altri approcci che ho visto stanno generando un comando net (anche se non credo che cambiare servizio sia possibile in quel modo) e più recentemente con PowerShell (non consente di modificare le proprietà di un servizio, anche se non ho esperienza con questo .. .). – mjv

+1

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

1

È necessario concedere l'accesso all'account SERVIZIO LOCALE in SQL Express. Come da mio commento, il mio consiglio sarebbe quello di creare un nuovo account su cui il vostro servizio può essere eseguito e quindi aggiungere le autorizzazioni rilevanti all'interno di SQL Express, in altre parole, non eseguire il servizio in LOCAL SERVICE.

+1

Ci ho pensato, ma a quel punto nessun servizio avrebbe avuto accesso al mio db? –

+0

Ogni servizio in esecuzione con quell'account si. È necessario creare un account separato e specificare solo le autorizzazioni necessarie. – James

2

Se si desidera utilizzare l'autenticazione di Windows trusted, la cosa più semplice da fare è eseguire il servizio con un account di dominio (con i privilegi minimi richiesti) autorizzato al database del server SQL.

3

Quando un servizio di Windows viene avviato da Gestione controllo servizi, il processo viene eseguito come un utente particolare proprio come con qualsiasi altro processo in esecuzione sul sistema operativo.

Esistono numerosi account utente "incorporati" utilizzati per l'esecuzione di Servizi Windows. È possibile visualizzare il set completo di Servizi Windows e l'account che eseguono come (denominato "Accedi come" in Windows 7) se si guarda il nodo "Servizi" all'interno di Gestione computer ".

Dalla mia esperienza, quando vogliamo un servizio di Windows per parlare al DB utilizzando la protezione integrata prendiamo il secondo approccio seguito:

1) Assegnare uno degli account predefiniti come "Accesso come" account e aggiungi questo account come login sull'istanza di SQL Server con le autorizzazioni DB appropriate

2) Utilizzare/creare un account locale o di dominio per il servizio Windows da utilizzare e quindi aggiungere questo account come accesso con il DB appropriato permessi. È possibile attraverso il programma di installazione richiedere le credenziali dell'account utente durante l'installazione del servizio.

non posso affermare di essere abbastanza esperto per segnalare tutti i pro ei contro di ogni approccio, tuttavia vale la pena considerare le seguenti:

  • con l'approccio 1 tutti i servizi e processi che vengono eseguiti come selezionato l'account integrato avrà il permesso di accedere al tuo database. Questo non è il caso dell'approccio 2.

  • con approccio 1 la configurazione della password è gestita dalla macchina stessa ma con l'approccio 2 la password può essere gestita dagli amministratori e anche conforme alle eventuali politiche di sicurezza richieste.

Spero che questo aiuta

1

Come MJV Detto questo, è necessario o dare accesso account di servizio locale per il database o utilizzare un account diverso per eseguire il servizio. Hai chiesto come è possibile modificare l'account a livello di codice, operazione che viene eseguita creando un programma di installazione per il servizio e modificando la proprietà Account su "Utente", quindi specificando Username e Password per eseguire il servizio.

Il seguente link contiene informazioni sulla creazione del programma di installazione se si scorre verso il basso:

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

Mentre il seguente fornisce qualche dettaglio in più sulla proprietà Account:

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

Spero che questo aiuti.

Problemi correlati