Newsgroup: it.comp.programmare.win32
Titolo: [NT/2000][MFC] Impersonificare l'amministratore di sistema

Ho sviluppato un'applicazione che per funzionare deve essere eseguita
nel contesto di privilegi dell'amministratore di sistema. Siccome io
voglio utilizzare il mio programma soprattutto quando l'utente loggato
e' un utente semplice, avrei bisogno di un meccanismo che mi permetta
di acquisire temporaneamente i privilegi di amministratore solo per
eseguire l'applicazione.
Ho cercato sull'MSDN ed ho trovato le API "LogonUser" e
"CreateProcessAsUser" che ho utilizzano nel seguente modo:
/*******************************************/
LPTSTR lpszUsername = "Administrator";
LPTSTR lpszDomain = ".";
LPTSTR lpszPassword = "londra";
DWORD dwLogonType = LOGON32_LOGON_BATCH;
DWORD dwLogonProvider = LOGON32_PROVIDER_DEFAULT;
HANDLE hToken    = NULL;
bRet = LogonUser(
   lpszUsername,
   lpszDomain,
   lpszPassword,
   dwLogonType,
   dwLogonProvider,
   &hToken );
if ( bRet == TRUE ) // successo
{
   ASSERT( hToken != NULL );
   LPCTSTR lpApplicationName = "";
   LPTSTR lpCommandLine = "" ;
   LPSECURITY_ATTRIBUTES lpProcessAttributes = NULL;
   LPSECURITY_ATTRIBUTES lpThreadAttributes = NULL;
   BOOL bInheritHandles = FALSE;
   DWORD dwCreationFlags = CREATE_NEW_CONSOLE | NORMAL_PRIORITY_CLASS;
   LPVOID lpEnvironment = NULL;
   LPCTSTR lpCurrentDirectory = NULL;
   STARTUPINFO stcStartupInfo;
   stcStartupInfo.cb = sizeof( stcStartupInfo );
   stcStartupInfo.lpReserved = NULL;
   stcStartupInfo.dwFlags = 0;
   stcStartupInfo.cbReserved2 = 0;
   stcStartupInfo.lpReserved2 = NULL;
   stcStartupInfo.lpDesktop = NULL;
   stcStartupInfo.lpTitle = NULL;
   stcStartupInfo.dwX = 0;
   stcStartupInfo.dwY = 0;
   stcStartupInfo.dwXSize = 0;
   stcStartupInfo.dwYSize = 0;
   stcStartupInfo.dwXCountChars = 0;
   stcStartupInfo.dwYCountChars = 0;
   stcStartupInfo.dwFillAttribute = 0;
   stcStartupInfo.dwFlags = 0;
   stcStartupInfo.wShowWindow = 0;
   stcStartupInfo.hStdInput = NULL;
   stcStartupInfo.hStdOutput = NULL;
   stcStartupInfo.hStdError = NULL;
   PROCESS_INFORMATION stcProcessInfo;
   bRet = CreateProcessAsUser(
      hToken,
      lpApplicationName,
      lpCommandLine,
      lpProcessAttributes,
      lpThreadAttributes,
      bInheritHandles,
      dwCreationFlags,
      lpEnvironment,
      lpCurrentDirectory,
      &stcStartupInfo,
      &stcProcessInfo );
   if ( bRet != TRUE ) // errore
   {
       TRACE( "*** ERROR *** 0x%0.8X\n", GetLastError( ) );
   }
}
else // errore
{
   TRACE( "*** ERROR *** 0x%0.8X\n", GetLastError( ) );
}
/*******************************************/
Purtroppo pero' la chiamata a "LogonUser" fallisce sistematicamente con
l'errore ERROR_PRIVILEGE_NOT_HELD [Il privilegio richiesto non
appartiene al client].
Qualcuno sa come risolvere questo problema?
Grazie e ciao
merlinO
Sent via Deja.com
http://www.deja.com/



appartiene al client].
come riportato anche nella documentazione LogonUser necessita che:
1) il chiamante abbia accreditato/abilitato il privilegio SE_TCB_NAME 
2) l'account possegga di privilegi rispondenti al logon type richiesto
cmq sia concedere SE_TCB_NAME agli user e' ovviamente improponibile, 
l'impersonation e' una feature molto potente ma da utilizzarsi 
nei modi appropriati: nel tuo caso direi proprio che potresti
utilizzare come base l'ottimo (come sempre) articolo dell'MSDN
Magazine di K. Brown mirato appunto alla realizzazione di un logon
broker. 
Saluti,
           Walker Boh

            Walker Boh
grazie e ciao
merlinO

debole... :o(
concordo (btw la frase "come sempre" era riferita a K. Brown non certo
all'MSDN):  non solo a volte lasciano a desiderare x completezza ma
anche x chiarezza e corettezza.. e' davvero seccante perdere tempo
durante il bug tracking xche' la documentazione e' fuorviante.
Saluti,
 Walker Boh

debole... :o(


debole... :o(
