Ciao a tutti !
Sono giorni che sbatto la testa su una questione per me completamente nuova, legata ai privilegi. Dagli esempi trovati in internet e dall'MSDN sono riuscito a capirci qualcosa ma non tutto, così mi rivolgo a voi.
Sostanzialmente devo poter registrare dll e ocx programmaticamente. Per fare questo di soltio richiamo le funzioni DllRegisterServer e DllUnRegisterServer esportate da tutti gli oggetti COM e tutto funziona perfettamente.
Ora mi si presenta una situazione particolare: il mio codice dovrà girare nella sessione di un utente senza i privilegi necessari a svolgere questo tipo di operazioni.
Come vi dicevo mi sono documentato e ho scoperto che la funzione API LogonUser permette di loggarsi programmaticamente come "altro utente" così poter operare con determinate credenziali (una sorta di RunAs...). Ho scoperto, inoltre, che per potersi loggare con questa funzione occorre avere i privilegi "trusted computer base" (SE_TCB_NAME)
Ho messo su un giro di codice che sembra funzionare fino al momento del logon. Vi spiego a parole (o meglio in pseudo-codice come meglio posso) quello che ho fatto segnalandovi anche i valori restituiti dalle varie funzioni chiamate ed eventuali dubbi.
Dato che il codice originale è scritto in VB lo posterò solo se me lo richiederete...
codice:
// ottiene l'handle del processo corrente
hProc = GetCurrentProcess();
// ottiene l'accesso al token associato al processo corrente
// OK: restituisce 1 e hToken è != 0
lRetVal = OpenProcessToken(hProc, TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, hToken);
TOKEN_PRIVILEGES TKP;
// ottiene il locally unique identifier (LUID) usato sul sistema per rappresentare
// il privilegio "trusted computer base"
// OK: restituisce 1 e la struttura LUID ritorna valorizzata !
// Ma è corretto passare una stringa nulla ?
lRetVal = LookupPrivilegeValue("", SE_TCB_NAME, TKP.Privileges(0).pLuid);
// abilita il privilegio
TKP.PrivilegeCount = 1;
TKP.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED;
TOKEN_PRIVILEGES prevTKP;
// abilita il privilegio per il token specificato e recupera privilegi precedenti
// OK: restituisce 1 !
// lPrevTKPLength ritorna 4, come mai ?
lRetVal = AdjustTokenPrivileges(hToken, false, TKP, SizeOf(TKP), prevTKP, lPrevTKPLength);
// preparo i dati per il logon
sUserName = "MioUserName";
sDomainName = "MioDominio";
sPassword = "MiaPassword";
// Tenta di eseguire il Logon
lRetVal = LogonUser(sUserName, sDomainName, sPassword
, LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, hToken)
La funzione LogonUser mi restituisce sempre 0 nonostante i dati di nome-utente, password e dominio siano corretti. Si tratta degli stessi dati con cui lancio con successo un processo mediante RunAs.
Probabilmente, ammesso che questo pseudo-code da 4 soldi sia abbastanza chiaro, qualcuno di voi avrà già individuato il problema. Io ho l'impressione che manchi qualche "ingranaggio", qualche cosa che non ho considerato. Altrimenti non mi spiego come mai tutto sembra andare a meraviglia tranne il Logon.
Ho trovato migliaia di esempi in internet, scritti in Delphi, VB o C++. Fanno tutti esattamente la stessa cosa: quello che ho fatto io ! Di tutti quelli scritti in VB non ne funziona neanche uno e tutti presentano il mio stesso problema.
Che fare ?
Ciao e grazie in anticipo per l'aiuto che mi darete.
Simo