Discussione:
ancora CGI e problemi di esecuzione
(troppo vecchio per rispondere)
Juri
2012-10-16 14:28:23 UTC
Permalink
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
Paolo Arosio
2012-10-17 15:09:54 UTC
Permalink
On Oct 16, 4:28 pm, Juri <***@gmail.com> wrote:
[...]
Post by Juri
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.
[... 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
Paolo Arosio
2012-10-17 15:18:05 UTC
Permalink
Post by Juri
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.
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
Juri
2012-10-19 10:40:00 UTC
Permalink
Post by Paolo Arosio
Post by Juri
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.
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
Juri
2012-10-23 18:14:13 UTC
Permalink
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
Juri
2012-10-25 12:41:16 UTC
Permalink
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

Continua a leggere su narkive:
Loading...