2009-02-18 11 views
29

Come può un programma C# in esecuzione come LocalSystem impersonare temporaneamente l'identità di accesso di un altro utente? In parole povere ho un servizio di Windows che mi piacerebbe eseguire come LocalSystem ma a volte impersona l'utente XYZ (quando si connette a un db usando la sicurezza integrata di Windows).Rappresentazione di Windows da C#

Il più importante di tutti: c'è un modo per farlo senza conoscere la password dell'altro utente?

Nota: se una password è obbligatoria, esiste una strategia consigliata per archiviare una password in modo sicuro (C# e/o vbscript).

+0

Per il codice di rappresentazione, vedere i due articoli di codice seguenti: [http://www.codeproject.com/KB/cs/cpimpersonation1.aspx](http://www.codeproject.com/KB/cs/cpimpersonation1 .aspx) [http://www.codeproject.com/KB/cs/zetaimpersonator.aspx] (http://www.codeproject.com/KB/cs/zetaimpersonator.aspx) e l'articolo della Microsoft KB su cui si basano: [http://support.microsoft.com/default.aspx?scid=kb; it-it; Q306158] (http://support.microsoft.com/default.aspx?scid=kb;en-us;Q306158) – mundeep

risposta

18

E 'possibile, anche se richiede di fare un sacco di codice. Vedi NtCreateToken e CreateToken. Hai bisogno di SeCreateTokenPrivilege, anche se non sarà un problema dato che stai usando NT AUTHORITY \ SYSTEM. È quindi possibile utilizzare il token creato per impersonare all'interno di un thread.

+0

Grazie. Non c'è molto in termini di esempi di codice là fuori per questo però :) – user53794

+7

Si noti che non è consigliabile eseguire servizi in LocalSystem, e gli amministratori di sistema corrugano giustamente su questa pratica. –

+27

Nello stackoverflow, preferisco fare/rispondere a ciò che viene richiesto. – wj32

5

Per la memorizzazione della parte della password, è possibile dare un'occhiata a this question chiesto di recente.

Questa era la mia risposta:

Si potrebbe/dovrebbe utilizzare il DPAPI, il Data Protection API che fornisce la crittografia di archiviazione.
È solo per questo tipo di problema.

crittografia dello storage si basa su entrambi:

  • l'account utente, in modo che solo l'utente connesso può accedere ai dati. Ciò rende i dati trasferibili su un altro PC con le stesse identiche credenziali utente.
  • la macchina, rendendo i dati accessibili solo su quella particolare configurazione della macchina e non trasferibili su un altro PC.

C'è un dnrTV show with Karl Franklin che mostra esattamente cosa è necessario implementare questo e altre funzioni di crittografia.
Il codice sorgente dallo spettacolo è anche disponibile sulla pagina.

Ci sono, naturalmente, un sacco di other articles su questo argomento.

10

Risposta breve: non è possibile senza la password utente o l'utente che chiama il servizio tramite COM.

Per impersonare un altro utente nel processo, è necessario chiamare ImpersonateLoggedOnUser. ImpersonateLoggedOnUser richiede un handle di token. Esistono diversi modi per ottenere il token handle:

Problemi correlati