Newsgroup: it.comp.lang.delphi
Titolo: ancora CGI e problemi di esecuzione

Buongiorno a tutto il NG,
apro una nuova discussione in quanto non sono riuscito a risolvere un 
problema molto strano.
Ho realizzato un CGI da installare su IIS7 e Win7 o Win2008R1. Creando 
una simulazione locale sul mio pc Con IIS7 e Win7 tutto funziona, ma 
quando lo installo su un sistema remoto (ho provato con varie 
combinazioni), non riesco ad eseguire un applicazione dal CGI, anche se 
installata nella stessa macchina.
L'applicazione che cerco di eseguire funziona correttamente quando viene 
lanciata da riga di comando e il suo log indica perfettamente tutte le 
funzioni eseguite.
La cosa strana è che attraverso il CGI sono ingrado di trasmettere e 
salvare file, salvare sessioni di login, salvare files di log, ma non di 
eseguire applicazioni, ne l'applicazione di mio interesse ne altre.
 
Ho provato inizialmente a dare permessi di esecuzione ad "everyone" e 
poi restringere man mano, ma non ho avuto successo con l'esecuzione di 
applicazioni.
 
Per cercare di essere completo nell'esposizione del problema, di seguito 
vi sono le funzioni che ho sperimentato per eseguire l'applicazione esterna:
 
function Sto_ShellExecute(const FileName, Parameters: String;
   var ExitCode: DWORD; const Wait: DWORD = 0; const Hide: boolean = False)
   : boolean;
var
   myInfo: SHELLEXECUTEINFO;
   iWaitRes: DWORD;
begin
   ZeroMemory(@myInfo, SizeOf(SHELLEXECUTEINFO));
   myInfo.cbSize := SizeOf(SHELLEXECUTEINFO);
   myInfo.fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_NO_UI;
   myInfo.lpFile := PChar(FileName);
   myInfo.lpParameters := PChar(Parameters);
   myInfo.lpParameters := nil;
   //myInfo.lpVerb := 'RunAs';
   if Hide then
     myInfo.nShow := SW_HIDE
   else
     myInfo.nShow := SW_SHOWNORMAL;
   // start file
   ExitCode := 0;
   Result := ShellExecuteEx(@myInfo);
   case myInfo.hInstApp of
     ERROR_FILE_NOT_FOUND: DebugWrite('Error: File not found');
     ERROR_PATH_NOT_FOUND: DebugWrite('Error: Path Not Found');
     ERROR_DDE_FAIL: DebugWrite('Error: DDE transaction failed');
     ERROR_NO_ASSOCIATION: DebugWrite('Error: There is no application 
associated with the given filename extension');
     ERROR_ACCESS_DENIED: DebugWrite('Error: Access Denied');
     ERROR_DLL_NOT_FOUND: DebugWrite('Error: DLL Not Found');
     ERROR_CANCELLED: DebugWrite('Error: The function prompted the user 
for the location of the application, but the user cancelled the request.');
     ERROR_NOT_ENOUGH_MEMORY: DebugWrite('Error: Out Of Memory');
     ERROR_SHARING_VIOLATION: DebugWrite('Error: Sharing Violation');
   end;
   // if process could be started
   if Result then
   begin
     // wait on process ?
     if (Wait > 0) then
     begin
       iWaitRes := WaitForSingleObject(myInfo.hProcess, Wait);
       // timeout reached ?
       if (iWaitRes = WAIT_TIMEOUT) then
       begin
         Result := False;
         TerminateProcess(myInfo.hProcess, 0);
       end;
       // get the exitcode
       GetExitCodeProcess(myInfo.hProcess, ExitCode);
     end;
     // close handle, because SEE_MASK_NOCLOSEPROCESS was set
     CloseHandle(myInfo.hProcess);
   end
   else
     ExitCode := 1;
end;
 
Di cui l'unico risultato è:
- iWaitRes = 258
- ExitCode = 259
 
ed inoltre
 
function WinExecAsUser(FileName: string; username: string; password:
string; Visibility: integer): Boolean;
var { V1 by Pat Ritchey, V2 by P.Below }
   zAppName          : array[0..512] of char;
   StartupInfo       : TStartupInfo;
   ProcessInfo       : TProcessInformation;
   h                 : thandle;
begin { WinExecAndWait32V2 }
   Result := True;
   StrPCopy(zAppName, FileName);
   FillChar(StartupInfo, Sizeof(StartupInfo), #0);
   StartupInfo.cb := Sizeof(StartupInfo);
   StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
   StartupInfo.wShowWindow := Visibility;
   if not LogonUser(pchar(username), '.', pchar(Password),
     LOGON32_LOGON_INTERACTIVE,
     LOGON32_PROVIDER_DEFAULT, h) then
     begin
       Result := false;
       Exit;
     end;
   CreateProcessAsUser(h, nil,
     zAppName, { pointer to command line string }
     nil, { pointer to process security attributes }
     nil, { pointer to thread security attributes }
     false, { handle inheritance flag }
     CREATE_NEW_CONSOLE or { creation flags }
     CREATE_NEW_PROCESS_GROUP,
     //NORMAL_PRIORITY_CLASS,
     nil, { pointer to new environment block }
     nil, { pointer to current directory name }
     StartupInfo, { pointer to STARTUPINFO }
     ProcessInfo); { pointer to PROCESS_INF }
   if GetLastError <> 0 then
   begin
     Result := false;
   end;
end;
 
Che mi restituisce un messaggio: "Il privilegio richiesto non appartiene 
al client"
 
Chiedo cortesemente il vostro aiuto in quanto sono veramente in alto 
mare e non ho più tempoa disposizione.
 
Vi ringrazio anticipatamente
 
Ciao
 
Juri
 
 

 installata nella stessa macchina.
[... cut all ...]
 
Se sul tuo PC tutto funziona non è un problema della applicazione, ma
della configurazione della applicazione web *o* dei parametri di
sicurezza del sistema *o* dei permessi dell'eseguibile esterno.
 
Con la CreateProcessAsUser, che credenziali utilizzi?
 
Hai provato a fare una cgi minimale che non fa null'altro che eseguire
un'applicazione esterna quando si esegue una get? (e provarla sul tuo
sistema e su quello remoto)?
 
Vedi anche questo post: 
http://ca2.php.net/manual/en/function.exec.php#86444
 
e i seguenti. Parla di PHP, ma l'exec di PHP è implementata con una
CreateProcess su Win, quindi il problema è uguale al tuo.
 
HTH e
Saluti
Paolo Arosio

 installata nella stessa macchina.
 
E vedi anche questo:
http://www.iis-aid.com/articles/trouble_shooting/warning_exec_function_exec_unable_to_fork
 
 
ovviamente, se l'applicazione web accetta l'aaccesso anonimo (processo
eseguito come IUSR_%COMPUTERNAME%)
 
Saluti
Paolo Arosio


Grazie Paolo,
ero arrivato alla tua stessa conplusione ed infatti sto provando ad 
eseguire vari test. Il problema sembra dovuto al fatto che iis7 includa 
tutta una serie di restrizioni che impediscono ad un CGI di eseguire un 
applicazione esterna, ma non ho sufficienti nozioni per impostare 
correttamente iis7. Ho chiesto ad un amico di eseguire lo stesso test su 
iis6 e tutto funziona correttamente. Ho provato a modificare alcune 
impostazioni su iis7, e sono passato dal messaggio di errore "Il 
privilegio richiesto non appartiene al client" al messaggio "Per 
eseguire l'operazione richiesta è necessaria l'esecuzione con privilegi 
elevati". Ho provato a ridurre al minimo il livello di controllo di UAC, 
ma non è cambiato nulla. Hai qualche suggerimento/dritta da darmi ? Sono 
abbastanza in difficoltà, se ci fosse q. dalle parti di Venezia in grado 
di risolvermi il problema, gli darei volentieri l'incarico.
 
Grazie
 
Ciao
 
Juri

Ciao Paolo,
ho nuovi risultati, utilizzando LogonUser, DuplicateTokenEx e 
CreateProcessAsUser, modificato i parametri di SecurityAttributes, sul 
server trovo l'applicazione tra i processi, avviata dall'utente con 
diritti di amministrazione che ho scelto, ma bloccata come fosse 
congelata. GetExitCodeProcess giustamente restituisce errore 259, 
l'applicazione risulta il esecuzione. Come posso analizzare e 
diagnosticare q. in questa situazione?
 
Ciao
 
Juri

Se qualcuno ha il mio stesso problema, vi comunicao che ne ho 
individuato la causa: il problema � dovuto a "Session 0 Isolation"
ovvero la sessione in cui girano tutti i servizi, iis compreso. Sto 
cercando una soluzione per lanciare un'applicazione da iis ma in una 
sessione diversa da 0 e da quello che ho letto dovrebbe esserci una 
scappatoia utilizzando CreateProcessAsUser. Quando avr� maggiori 
informazioni le poster�.
 
Ciao
 
Juri