C ++ – GetUserName () quando il processo viene eseguito come amministratore

Ho un semplice programma C ++ che richiede il nome utente

#include  #include  #include  int _tmain(int argc, _TCHAR* argv[]) { wchar_t username[UNLEN + 1]; DWORD username_len = UNLEN + 1; ::GetUserName(username, &username_len); MessageBox(NULL, username, NULL, 1); return 1; } 

GetUserName () si comporta come previsto negli account amministratore, ovvero stampa il nome utente reale.

Tuttavia, quando viene eseguito come amministratore in un account non amministratore , viene visualizzato il nome dell’amministratore e non l’utente reale registrato.

Credo che questo comportamento sia previsto poiché è documentato in GetUserName () :
Se il thread corrente sta impersonando un altro client, la funzione GetUserName restituisce il nome utente del client che il thread sta impersonando.

Domanda

C’è un modo per ottenere il vero utente connesso (quello non amministratore), anche se il processo viene eseguito come amministratore?

Credo che la domanda che vuoi porre a Windows sia “quale utente è connesso alla sessione corrente”.

Per eseguire questa operazione, chiamare ProcessIdToSessionId () con l’ID del proprio processo per determinare l’ID di sessione corrente.

Quindi chiamare WTSQuerySessionInformation () con l’opzione WTSUserName per recuperare il nome utente.

Il problema non è un thread che sta impersonando. Stai eseguendo l’intera applicazione sotto il login dell’amministratore. Ecco perché Windows ti ha chiesto di accedere con un account amministratore, quando l’hai avviato da un account non amministratore.

Pertanto, il risultato ottenuto da GetUserName() è corretto. Quel nome è il vero utente loggato della tua app.

Se si desidera l’altro nome, la soluzione standard è di iniziare come utente normale e avere un pulsante “Elevare” che riavvia l’applicazione con privilegi elevati. Guarda come Task Manager, lo fa se vuoi vedere tutti i processi in esecuzione. Ovviamente a questo punto è ansible passare tutto ciò che si desidera al nuovo processo, incluso quel nome utente.