Problemi di autenticazione utente con il provider WinNT delle interfacce del servizio Active Directory
Questo articolo descrive i problemi di autenticazione utente con il provider WinNT di Active Directory Service Interfaces (ADSI).
Si applica a: Windows 10 - tutte le edizioni
Numero KB originale: 218497
Riepilogo
Il metodo ADSI OpenDsObject o la funzione helper ADsOpenDsObject C consente di fornire le credenziali di autenticazione al server di directory quando si apre un oggetto . Esistono diversi problemi da tenere presenti quando si usa questa tecnica con il provider WinNT delle interfacce del servizio Active Directory.
Ulteriori informazioni
Il provider WinNT dell'interfaccia del servizio Active Directory usa la funzione WNetAddConnection2 per stabilire una connessione a \\nomeserver\IPC$ per stabilire queste credenziali con il server remoto. Questo metodo è utile perché non richiede privilegi speciali per i client NT e funziona in Windows e supporta l'autenticazione tra domini non attendibili.
Sfortunatamente, esistono diversi svantaggi intrinseci nella funzione WNetAddConnection2 e sono i seguenti:
Se è già stata stabilita una connessione al server di destinazione da qualsiasi processo in esecuzione nel computer client, la funzione WNetAddConnection2 non può stabilire una nuova connessione con credenziali diverse da quelle usate per la connessione esistente.
Se si tenta di autenticare un nuovo account, verrà visualizzato un errore di credenziali in conflitto. Se si tenta di autenticare l'account esistente, qualsiasi password funzionerà (valida o meno). Si tratta di un problema particolare quando si ottengono oggetti da un controller di dominio in cui molti processi di sistema stabiliscono connessioni ai controller di dominio.
Se l'account guest è abilitato nel computer di destinazione, è possibile passare sia un nome utente che una password non validi e creare una connessione.
Il sistema non fa riferimento al numero di connessioni, pertanto, se un processo, incluso il processo client dell'interfaccia del servizio Active Directory, elimina la connessione, quindi tutti i processi che usano tale connessione devono essere scritti per ristabilire il processo quando lo trovano eliminato.
Quando si usa il provider WinNT, è consigliabile eseguire l'autenticazione con il server di destinazione accedendo a un account di dominio con credenziali appropriate o usando la funzione LogonUser (che richiede privilegi elevati) prima di eseguire il codice dell'interfaccia del servizio Active Directory. È inoltre consigliabile non usare il metodo OpenDsObject dell'interfaccia del servizio Active Directory per convalidare le credenziali di un utente in qualsiasi dominio considerato attendibile dal computer client.
Se si sta tentando di convalidare gli account da domini non attendibili, usare il metodo OpenDsObject delle interfacce del servizio Active Directory, tenendo presenti i problemi elencati in precedenza e comprendendo che si invieranno password non crittografate in rete. È possibile superare queste restrizioni eseguendo codice di convalida come servizio in almeno un server in ogni set di domini non attendibili usando una connessione SSL (o HTTPS) per fornire la crittografia. A tale scopo, usare un file di convalida .asp in un server IIS in ogni set di domini non attendibili e connettersi tramite HTTPS usando l'autenticazione di base.
Il metodo OpenDsObject dell'interfaccia del servizio Active Directory usa le credenziali dell'utente connesso per accedere a IIS. Il nome utente e la password specificati come parametri vengono ignorati. Viene visualizzato il messaggio di errore seguente:
Accesso negato
Tuttavia, funziona dopo l'aggiunta dell'utente connesso del client al gruppo Administrators del server.
Funziona anche se si usa il codice script seguente.
Set objLogon = CreateObject("LoginAdmin.ImpersonateUser")
objLogon.Logon "Administrator", "AdminPassword", "Machinename"
Set oNS = GetObject("IIS:")
Set oRoot = oNS.OpenDSObject("IIS://SERVER/SHARE", "Mordor\administrator", "Gollum", 1)'User credentials are ignored
objLogon.Logoff
Set objLogon = Nothing