2009-06-07 12 views
9

Devo modificare l'utente di accesso per un servizio di Windows a livello di programmazione. E Sto usando il seguente codice per farlo:Modifica utente Servizio di Windows a livello di programmazione

string objPath = string.Format("Win32_Service.Name='{0}'", ServiceName); 
using (ManagementObject service = new ManagementObject(new ManagementPath(objPath))) 
{ 
object[] wmiParams = new object[11]; 

if (PredefinedAccount) 
    { 
     wmiParams[6] = "LocalSystem"; 
      wmiParams[7] = ""; 
    } 
    else 
    { 
     wmiParams[6] = ServiceUsername; // provided by user 
      wmiParams[7] = ServicePassword; // provided by user 
    } 

    object invokeResult = service.InvokeMethod("Change", wmiParams); 

// handle invokeResult - no error up to this point 
} 

Questo codice funziona nel 90% dei casi, ma in qualche servizio situazioni non può essere avviato a causa di errore di accesso. Di solito non c'è errore InvokeMetod ma quando si cerca di avviare il servizio si ottiene il seguente errore:

System.InvalidOperationException: Cannot start service X on computer '.'. --> System.ComponentModel.Win32Exception: The service did not start due to a logon failure.

La soluzione soluzione è semplice, abbiamo solo bisogno di inserire le stesse credenziali tramite l'interfaccia di Windows ed il problema è risolto.

Quindi la mia domanda è, qualcuno ha riscontrato il problema simile con ManagementObject perché sembra che in qualche situazione non riguardi Username e password per il servizio di Windows?

+1

Mi chiedo se è a causa della vostra istruzione using. Quello che intendo è che il ManagementObject viene distrutto prima di poterlo completare? Non ho molta familiarità con WMI, quindi non ne sono sicuro. – HVS

+0

Poiché il nome utente e la password sono stati immessi dall'utente, anch'io cercherò di verificare i problemi. Assicurati che siano nomi validi. "DOMINIO \ nomeutente" è valido in qualsiasi sistema, ma "nome utente @ DOMINIO" non funziona in Windows 2000 e versioni precedenti. – HVS

+0

Abbiamo lo stesso problema e sono abbastanza sicuro che il servizio sia stato installato con un programma di installazione C#, .net 1.1. Avvio il servizio dalla riga di comando ('net start') e ottengo l'errore di accesso. Stranamente questo accade con 2 dei 7 servizi installati sulla macchina (probabilmente usando lo stesso codice di installazione). Non ho ancora avuto modo di diagnosticarlo ma la macchina è Windows 2003 Server con i service pack più recenti. I servizi sono C# .net 2.0 codice. Digitando manualmente la password lo corregge fino al riavvio. – LegendLength

risposta

0

Avete notato qualche schema tra quei guasti? Stessa macchina? Stesso sistema operativo? Lo stesso utente? L'utente ha i diritti "logon as service" o "accesso interattivo"? Personalmente, non ho familiarità con questo metodo di specificare l'utente per un servizio. Avrei pensato che avresti dovuto riavviare il servizio, ma suppongo di no se funziona il 90% delle volte.

+0

Beh, dipende da vari sistemi operativi. Non c'è schema. A volte ciò si verifica se la password è breve (meno di 7 caratteri). In tutti questi casi il problema è stato risolto quando l'utente ha inserito lo stesso nome utente e password tramite l'interfaccia predefinita di Windows. Quindi presumiamo che sia qualcosa nel nostro codice o nel ManagementObject che stiamo usando. – Anne

9

Non sono sicuro se questo problema è stato risolto. Ma abbiamo appena riscontrato il problema simile e abbiamo capito che è perché l'account non ha il privilegio "Accedi come servizio". È necessario utilizzare LsaAddAccountRights per aggiungere tale privilegio all'account.

Visualizza questo articolo si prega:

How To Manage User Privileges Programmatically in Windows NT

+0

Brillante !!! Questo è stato il mio problema, grazie per aver postato questo. – lidermin

Problemi correlati