2012-04-30 3 views
10

sto usando LogonUser per convalidare un set di credenziali di dominio di un utente.Come utilizzare LogonUser per non utilizzare le credenziali memorizzate nella cache?

LogonUser(accountName, domain, password, 
     LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_WINNT50, ref token); 

Con risultati preoccupanti:

LogonType Current Password    Old password 
=========== ============================== ======================== 
Network  Succeeds      Succeeds 
Batch  Fails (0x00000569)    Fails (invalid password) 
Interactive Succeeds      Fails (invalid password) 

codici di errore:

  • 0x00000569: Errore durante l'accesso: l'utente non ha ottenuto il tipo di accesso richiesto a questo computer
  • 0x0000052E: Errore di accesso: Unk nown nome utente o password

Dettagli:

  • se l'utente inserisce validi credenziali La funzione restituisce true. (buono)
  • se l'utente inserisce non validi credenziali La funzione restituisce false. (buono)

  • se l'utente cambia la password, ed entra i loro nuovi validi credenziali La funzione restituisce true. (buono)

  • se l'utente inserisce non validi credenziali La funzione restituisce false. (buono)

  • se l'utente inserisce i propri vecchi credenziali la funzione restituisce true. (male)

Nota: se l'utente passa a una macchina diversa (uno che non hanno mai connesso al precedente), ed entrano vecchi credenziali, LogonUser continua a return true. Ciò significa che la memorizzazione nella cache non sta avvenendo sul computer locale, ma in qualche modo "sulla rete".

  • se l'utente cambia la password nuovo, e entra nelle loro nuovi nuove credenziali, la funzione restituisce true.(buono)
  • se l'utente inserisce i propri vecchi credenziali la funzione restituisce true. (cattivo)
  • se l'utente inserisce i propri vecchi vecchi credenziali La funzione restituisce false. (buono)

Come, quando si chiama LogonUser can i istruzioni al fine di istruire il dominio non utilizzare credenziali memorizzate nella cache.

Nota: Se l'utente tenta di accedere a Windows con il loro vecchio (o vecchio vecchio) la password, ottengono l'errore password non valida.


Da MSDN:

LOGON32_LOGON_NETWORK
Questo tipo di accesso è destinato per server ad alte prestazioni per l'autenticazione password in chiaro. La funzione LogonUser non memorizza nella cache le credenziali per questo tipo di accesso.

LOGON32_LOGON_INTERACTIVE
Questo tipo di accesso è destinato a utenti che saranno interattivamente tramite il computer, ad esempio un utente che viene connesso da un server terminal, shell remota, o un processo simile. Questo tipo di accesso ha la spesa aggiuntiva di informazioni di accesso nella cache per le operazioni disconnesse; pertanto, è inappropriato per alcune applicazioni client/server, ad esempio un server di posta.

LOGON32_LOGON_BATCH Questo tipo di accesso è destinato per i server batch, in cui i processi possono essere in esecuzione per conto di un utente senza il suo intervento diretto. Questo tipo è anche per server con prestazioni più elevate che elaborano numerosi tentativi di autenticazione in testo normale alla volta, come server di posta o web.

i sono autenticazione password di testo, e in modo da utilizzare LOGON32_LOGON_NETWORK. Interactive credenziali di accesso alla cache, che non sono consentite qui. Batch, mentre non documentato su quando dovrebbe essere usato, semplicemente fallisce.


Aggiornamento: Il dominio consente solo:

  • la password precedente (non ulteriormente indietro)
  • solo per 60 minuti

E 'chiaro a me che si tratta di una "funzionalità" di Active Directory che offre un periodo di prova di 1 ora.

Tranne che non desidero il periodo di prova e non voglio modificare alcuna impostazione sul dominio (poiché non conosco alcuna impostazione sul dominio che consentirebbe un periodo di tolleranza di un'ora di utilizzo di la tua vecchia password).

risposta

4

È una funzionalità di NTLM. È possibile modificare il valore predefinito di 60 minuti. aggiungendo un valore DWORD in minuti alla chiave HKLM\SYSTEM\CurrentControlSet\Control\Lsa sul controller di dominio o disabilitare la politica "Applica cronologia password". Potresti anche provare a utilizzare un altro provider di accesso come LOGON32_PROVIDER_WINNT50.

BTW se si sta già fornendo una GUI, non vedo svantaggi usando LOGON32_LOGON_INTERACTIVE.

+1

i * am * utilizzando 'LOGON32_PROVIDER_WINNT50' - non * voglio * utilizzare NTLM privato. Quindi, la domanda diventa implicitamente "Come posso utilizzare Kerberos anziché l'autenticazione NTLM?". Ma la domanda di * "Perché' LogonUser' usa NTLM piuttosto che Kerberos? "* È una che né StackOverflow [né ServerFault sembrano essere in grado di rispondere] (http://serverfault.com/questions/384719/how-to -assicurare-machine-è-Kerberos al dominio). –