Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    LogonUser, privilegi e tokens. Chi mi aiuta ?

    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

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301

    Moderazione

    Il linguaggio di programmazione è indifferente?
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Dopo che la LogonUser viene eseguita, quanto vale la Err.LastDllError ?

  4. #4
    Il linguaggio di programmazione è indifferente?
    Per me, per capire dove concettualmente sbaglio, si ! Anche se, come dicevo, il codice lo sto scrivendo in VB. Trattandosi di un tema abbstanza complesso che può essere esposto in maniera generica ho pensato di postare qui la domanda per avere più udienza.

    Dopo che la LogonUser viene eseguita, quanto vale la Err.LastDllError ?
    Questo è un test che non avevo fatto...
    Effettivamente Err.LastDllError vale ERROR_PRIVILEGE_NOT_HELD, quindi l'errore sta nell'acquisire i privilegi SE_TCB_NAME ! Noto ora che, nonostante la LookupPrivilegeValue restituisca 1 e valorizzi la struttura LUID, dopo la chiamata a questa funzione Err.LastDllError vale 997.

    Qualcuno sa che significa ?

    Ciao
    Simo

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.