Newsgroup: it.comp.programmare.win32
Titolo: Esecuzione processo come altro utente

Buongiorno a tutti,
ho la necessità di lanciare (da codice C++ sotto Win2K) un processo come un
altro utente,
nello stesso modo del comando "Esegui come..." di Win2K.
Ho controllato su MSDN ed ho trovato un esempio ma purtroppo sembra non
funzionare.
Il codice è il seguente (esattamente come riportato su MSDN):
 HANDLE htok = 0;
 LogonUser( "Alice", ".", "password",
            LOGON32_LOGON_INTERACTIVE,
            LOGON32_PROVIDER_DEFAULT,
            &htok );
 STARTUPINFO si = { sizeof si, 0, "" };
 PROCESS_INFORMATION pi;
 CreateProcessAsUser( htok, // the security context
            0, "msdev.exe", // command line
            0, 0,  // security attributes
            FALSE, // handle inheritance
            0,     // creation flags
            0,     // environment block
            0,     // current directory
            &si, &pi );
 CloseHandle( htok );
 CloseHandle( pi.hThread );
 CloseHandle( pi.hProcess );
Esso compila ma il programma non viene proprio eseguito!! Ovviamente ho
sostituito UserName/Password con una coppia valida che si riferisce ad un
utente presente sulla mia macchina Win2K.....
Chi sa spiegarmi perchè????
Grazie anticipate!!!
--
Paolo (/A\xel)
Mail: 
djfelix7...@hotmail.com
 (Rimuovere _NOSPAM_ per rispondere!)
Web: 
http://axel.ns0.it
ICQ: 121230704

 Esso compila ma il programma non viene proprio eseguito!!
Hai verificato se LogonUser() ti restituisce un handle corretto? Hai provato
a chiamare GetLastError() dopo la CreateProcessAsUser() per verificare il
codice di errore?
--
Lorenzo

 codice di errore?
Si, la GetLastError() dopo la LogonUser() restituisce un codice di errore,
più precisamente ERROR_PRIVILEGE_NOT_HELD..... ho dato un'occhiata
su MSDN circa la LogonUser(), ed ho trovato la seguente spiegazione:
In Windows 2000, the process calling LogonUser requires the
SE_TCB_NAME privilege. The privilege does not need to be enabled.
The LogonUser function enables the privilege as necessary. If the calling
process does not have this privilege, LogonUser fails and GetLastError
returns ERROR_PRIVILEGE_NOT_HELD.
Beginning with Windows XP, this privilege is no longer required.
Stando a quello che c'è scritto, il privilegio non deve necessariamente
essere abilitato, però la funzione mi torna l'errore....
Come posso comportarmi?

 returns ERROR_PRIVILEGE_NOT_HELD.
Uhm... strano. Evidentemente LogonUser() non ha i privilegi necessari per
settare quel privilegio (gioco di parole malvagio). A questo punto prova a
settarlo "manualmente" usando  AdjustTokenPrivileges(),
GetTokenInformation() e amiche... magari ti danno qualche informazione in
piu`.
--
Lorenzo

 piu`.
Sotto Windows molte cose, a volte, sono strane!!!!
Avevo già dato un occhio alla AdjustTokenPrivileges(), ma una volta resomi conto
del casino da fare x usarla, sono finito in depressione e mi sono fatto una
camomilla...... :-)
In ogni caso ci proverò, sperando di riuscire a cavare il cosiddetto ragno dal
buco!!!
Per ora ti ringrazio e ti saluto.
--
Paolo (/A\xel)
Mail: 
djfelix7...@hotmail.com
 (Rimuovere _NOSPAM_ per rispondere!)
Web: 
http://axel.ns0.it
ICQ: 121230704
Sappiamo più cose inutili di quante ne ignoriamo necessarie.
(L. de Clapiers de Vauvenargues)

l'errore.... 
Allora... i privilegi ti vengono innanzitutto ASSEGNATI dall'authority 
di sicurezza, quando fai il logon, e te li tieni per tutta la sessione, 
e l'unico modo di cambiarli è intervenire sull'operato dell'authority, 
generalmente tramite le policy, e ripetere daccapo l'autenticazione: non 
c'è alcun modo di cambiare "in corsa" i privilegi ASSEGNATI
Per ragioni di sicurezza, tutti i privilegi ASSEGNATI ad un determinato 
token (un descrittore contenente tutte le informazioni necessarie per il 
controllo dei diritti d'accesso e dei privilegi di un determinato 
thread) sono inizialmente DISABILITATI, e vanno esplicitamente ABILITATI 
prima di poterne usufruire. Ma se non ti sono stati ASSEGNATI in primo 
luogo, non potrai ABILITARLI in seguito
Esempio: al gruppo Administrators generalmente viene ASSEGNATO il 
privilegio per l'arresto del sistema. Prima di poter arrestare il 
sistema con ExitWindowsEx, un determinato thread dovrà prima ottenere il 
token che sta impersonando, dopodichè di questo token dovrà provare, con 
AdjustTokenPrivileges, ad ABILITARE il privilegio necessario, infine 
potrà chiamare la funzione che richiede quel privilegio (nel nostro 
caso, ExitWindowsEx). Terminato il bisogno di privilegi al di sopra del 
normale, si riporta il token allo stato originale con una seconda 
chiamata a AdjustTokenPrivileges, che DISABILITERA' nuovamente tutti i 
privilegi. LogonUser semplicemente compie da sè tutti questi passi

 nello stesso modo del comando "Esegui come..." di Win2K.
Disponendo di apposite utility, scopriresti che i programmi lanciati in 
quel modo hanno come processo genitore non il processo da cui credi di 
averli lanciati, ma services.exe. Come dire che solo un servizio ha i 
privilegi per fare questo genere di giochetti - motivi di sicurezza 
(esattamente come su Unix solo root ha i privilegi per accedere al file 
delle password); e se fossi in Microsoft non farei un gran vanto 
dell'aver rimosso la necessità di questo privilegio in Windows XP

 dell'aver rimosso la necessità di questo privilegio in Windows XP
Innanzitutto grazie 1000 per la risposta esauriente, in secondo luogo
ho notato che sotto XP cambia qualcosa ma sinceramente l'ho usato
ancora troppo poco per rendermene bene conto... comunque mi
hai schiarito le idee e forse la soluzione era a portata di mano.. avevo
già usato un codice simile per effettuare un reboot forzato da applicazione
di tutto il sistema. Peccato che comunque non funzioni ancora per lo scopo
che serve a me....
A chi potesse interessare, posto il codice necessario (per il reboot):
int SystemReboot(void)
{
  HANDLE hToken;
  TOKEN_PRIVILEGES tkp;
  // Get a token for this process.
  if (!OpenProcessToken(GetCurrentProcess(),
        TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
  {
     return -1;
  }
  // Get the LUID for the shutdown privilege.
  LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
  tkp.PrivilegeCount = 1;  // one privilege to set
  tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
  // Get the shutdown privilege for this process.
  AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);
  // reboot the system
  if (!ExitWindowsEx(EWX_REBOOT | EWX_FORCEIFHUNG, 1000))
    return -1;
  return 0;
}

  LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
Semplice: anzichè questo, ti serve attivare il privilegio SE_TCB_NAME. 
Privilegi diversi garantiscono poteri diversi, tu qui non stai chiedendo 
di fare lo shutdown ma di essere considerato parte della Trusted 
Computer Base, quindi abilitato a permettere ad utenti di fare il login
-- 
Nato nel vizio, morto nel supplizio
Nato nel peccato, ad entrare sia invitato

 Computer Base, quindi abilitato a permettere ad utenti di fare il login
Grazie x la precisazione ma non è necessaria, era chiaro che il privilegio
per lo shutdown non serve per il mio scopo.... avevo già provato con
SE_TCB_NAME ma mi ha dato picche lo stesso!!!
Ciao.
--
Paolo (/A\xel)
Mail: 
djfelix7...@hotmail.com
 (Rimuovere _NOSPAM_ per rispondere!)
Web: 
http://axel.ns0.it
ICQ: 121230704
Sappiamo più cose inutili di quante ne ignoriamo necessarie.


provato con SE_TCB_NAME ma mi ha dato picche lo stesso!!!
GetLastError che restituisce?



Come riporta MSDN:
Errore Nr. 1314: (ERROR_PRIVILEGE_NOT_HELD)
A required privilege is not held by the client.
Questo vuol dire che tutta la musica x settare il privilegio non
funziona!!!

! Mi ricordo di te. E come dimenticarti, 
del resto? Non sei per caso quello che gio 15 nov 2001 08:42:38a, su 
it.comp.programmare.win32, ha scritto:

Te l'ho detto: scriviti un servizio, e la trafila del privilegio la fai 
al suo interno, cosě sei sicuro che funzioni



Ok, proverň la strada del servizio. Grazie di tutto!!!
Ciao!