Condividi tramite


Funzione LogonUserW (winbase.h)

La funzione LogonUser tenta di accedere a un utente nel computer locale. Il computer locale è il computer da cui è stato chiamato LogonUser. Non è possibile usare LogonUser per accedere a un computer remoto. Specificare l'utente con un nome utente e un dominio e autenticare'utente con una password testo non crittografato. Se la funzione ha esito positivo, si riceve un handle a un token che rappresenta l'utente connesso. È quindi possibile usare questo handle di token per rappresentare l'utente specificato o, nella maggior parte dei casi, per creare un processo eseguito nel contesto dell'utente specificato.

Sintassi

BOOL LogonUserW(
  [in]           LPCWSTR lpszUsername,
  [in, optional] LPCWSTR lpszDomain,
  [in, optional] LPCWSTR lpszPassword,
  [in]           DWORD   dwLogonType,
  [in]           DWORD   dwLogonProvider,
  [out]          PHANDLE phToken
);

Parametri

[in] lpszUsername

Puntatore a una stringa con terminazione Null che specifica il nome dell'utente. Si tratta del nome dell'account utente a cui accedere. Se si usa il formato nome entità utente (UPN), User@DNSDomainName, il parametro lpszDomain deve essere NULL.

[in, optional] lpszDomain

Puntatore a una stringa con terminazione Null che specifica il nome del dominio o del server il cui database account contiene l'account lpszUsername. Se questo parametro è NULL, il nome utente deve essere specificato in formato UPN. Se questo parametro è ".", la funzione convalida l'account usando solo il database dell'account locale.

[in, optional] lpszPassword

Puntatore a una stringa con terminazione Null che specifica la password in testo non crittografato per l'account utente specificato da lpszUsername. Al termine dell'uso della password, cancellare la password dalla memoria chiamando la funzione secureZeroMemory . Per altre informazioni sulla protezione delle password, vedere Gestione delle password.

[in] dwLogonType

Tipo di operazione di accesso da eseguire. Questo parametro può essere uno dei valori seguenti, definiti in Winbase.h.

Valore Significato
LOGON32_LOGON_BATCH
Questo tipo di accesso è destinato ai server batch, in cui i processi possono essere eseguiti per conto di un utente senza l'intervento diretto. Questo tipo è anche per i server con prestazioni più elevate che elaborano molti tentativi di autenticazione in testo non crittografato alla volta, ad esempio la posta o i server Web.
LOGON32_LOGON_INTERACTIVE
Questo tipo di accesso è destinato agli utenti che utilizzano il computer in modo interattivo, ad esempio un utente connesso da un terminale server, una shell remota o un processo simile. Questo tipo di accesso comporta la spesa aggiuntiva per la memorizzazione nella cache delle informazioni di accesso per le operazioni disconnesse; pertanto, è inappropriato per alcune applicazioni client/server, ad esempio un server di posta elettronica.
LOGON32_LOGON_NETWORK
Questo tipo di accesso è destinato ai server ad alte prestazioni per autenticare le password in testo non crittografato. La funzione logonUser non memorizza nella cache le credenziali per questo tipo di accesso.
LOGON32_LOGON_NETWORK_CLEARTEXT
Questo tipo di accesso mantiene il nome e la password nel pacchetto di autenticazione , che consente al server di stabilire connessioni ad altri server di rete durante la rappresentazione del client. Un server può accettare credenziali in testo non crittografato da un client, chiamare LogonUser, verificare che l'utente possa accedere al sistema attraverso la rete e comunicare ancora con altri server.
LOGON32_LOGON_NEW_CREDENTIALS
Questo tipo di accesso consente al chiamante di clonare il token corrente e di specificare nuove credenziali per le connessioni in uscita. La nuova sessione di accesso ha lo stesso identificatore locale, ma usa credenziali diverse per altre connessioni di rete.

Questo tipo di accesso è supportato solo dal provider di accesso LOGON32_PROVIDER_WINNT50.

Nota: a partire da gennaio 2023, non è possibile usare il tipo di accesso LOGON32_LOGON_NEW_CREDENTIALS con un account del servizio gestito del gruppo( gMSA).

LOGON32_LOGON_SERVICE
Indica un accesso di tipo servizio. L'account specificato deve avere il privilegio di servizio abilitato.
LOGON32_LOGON_UNLOCK
I GINA non sono più supportati.

Windows Server 2003 e Windows XP: Questo tipo di accesso è per DLL GINA che accedono agli utenti che eseguiranno l'accesso interattivo al computer. Questo tipo di accesso può generare un record di controllo univoco che indica quando la workstation è stata sbloccata.

[in] dwLogonProvider

Specifica il provider di accesso. Questo parametro può essere uno dei valori seguenti.

Valore Significato
LOGON32_PROVIDER_DEFAULT
Usare il provider di accesso standard per il sistema. Il provider di sicurezza predefinito viene negoziato, a meno che non si passi NULL per il nome di dominio e il nome utente non sia in formato UPN. In questo caso, il provider predefinito è NTLM.
LOGON32_PROVIDER_WINNT50
Usare il provider di accesso negoziata.
LOGON32_PROVIDER_WINNT40
Usare il provider di accesso NTLM.

[out] phToken

Puntatore a una variabile handle che riceve un handle a un token che rappresenta l'utente specificato.

È possibile usare l'handle restituito nelle chiamate alla funzione ImpersonateLoggedOnUser.

Nella maggior parte dei casi, l'handle restituito è un token primario che è possibile usare nelle chiamate alla funzione CreateProcessAsUser . Tuttavia, se si specifica il flag di LOGON32_LOGON_NETWORK, LogonUser restituisce un token di rappresentazione che non è possibile usare in CreateProcessAsUser a meno che non si chiami DuplicateTokenEx per convertirlo in un token primario.

Quando questo handle non è più necessario, chiuderlo chiamando la funzione CloseHandle.

Valore restituito

Se la funzione ha esito positivo, la funzione restituisce un valore diverso da zero.

Se la funzione ha esito negativo, restituisce zero. Per ottenere informazioni estese sull'errore, chiamare GetLastError.

Osservazioni

Il tipo di accesso LOGON32_LOGON_NETWORK è più veloce, ma presenta le limitazioni seguenti:

  • La funzione restituisce un token di rappresentazione , non un token primario. Non è possibile usare questo token direttamente nella funzione CreateProcessAsUser. Tuttavia, è possibile chiamare la funzione DuplicateTokenEx per convertire il token in un token primario e quindi usarlo in CreateProcessAsUser.
  • Se si converte il token in un token primario e lo si usa in CreateProcessAsUser per avviare un processo, il nuovo processo non può accedere ad altre risorse di rete, ad esempio server remoti o stampanti, tramite il redirector. Un'eccezione è che se la risorsa di rete non è controllata dall'accesso, il nuovo processo sarà in grado di accedervi.

Il privilegio SE_TCB_NAME non è necessario per questa funzione, a meno che non si esegua l'accesso a un account Passport.

L'account specificato da lpszUsername, deve avere i diritti dell'account necessari. Ad esempio, per accedere a un utente con il flag LOGON32_LOGON_INTERACTIVE, l'utente (o un gruppo a cui appartiene l'utente) deve avere il diritto di SE_INTERACTIVE_LOGON_NAME account. Per un elenco dei diritti dell'account che influiscono sulle varie operazioni di accesso, vedere Costanti diritti account.

Un utente viene considerato connesso se esiste almeno un token. Se si chiama CreateProcessAsUser e quindi si chiude il token, il sistema considera l'utente ancora connesso fino al termine del processo (e di tutti i processi figlio).

Se la chiamata LogonUser ha esito positivo, il sistema notifica ai provider di rete che l'accesso si è verificato chiamando NPLogonNotify funzione del punto di ingresso del provider.

Esempi

È possibile generare un token LocalService usando il codice seguente.

LogonUser(L"LocalService", L"NT AUTHORITY", NULL, LOGON32_LOGON_SERVICE, LOGON32_PROVIDER_DEFAULT, &hToken)

Nota

L'intestazione winbase.h definisce LogonUser come alias che seleziona automaticamente la versione ANSI o Unicode di questa funzione in base alla definizione della costante del preprocessore UNICODE. La combinazione dell'utilizzo dell'alias indipendente dalla codifica con il codice non indipendente dalla codifica può causare mancate corrispondenze che generano errori di compilazione o di runtime. Per altre informazioni, vedere convenzioni di per i prototipi di funzioni.

Fabbisogno

Requisito Valore
client minimo supportato Windows XP [solo app desktop]
server minimo supportato Windows Server 2003 [solo app desktop]
piattaforma di destinazione Finestre
intestazione winbase.h (include Windows.h)
libreria Advapi32.lib
dll Advapi32.dll

Vedere anche

di controllo di accesso client/server

funzioni di controllo di accesso client/server

CloseHandle

CreateProcessAsUser

DuplicateTokenEx

ImpersonateLoggedOnUser