PDA

Ver la Versión Completa : Api CreateProcessAsUser


aeff
12-01-2007, 05:37:27
hola colegas del club, ante todo mis especiales saludos y un tremendo FELICIDADES por este nuevo año, y para iniciar con mis preguntaderas quisera saber si alguien me puede decir como trabajar con la API CreateProcessAsUser, si pueden y no es mucha molestia, me pueden mostrar algun ejemplito???

gracias antemano

salu2!!!

delphi.com.ar
12-01-2007, 14:19:01
Espero que te sea de utilidad:

procedure RunAs(ACommandLine, AUserName, ADomain, APassword: PAnsiChar);
var
hToken: Cardinal;
ProcessInfo: TProcessInformation;
StartupInfo: TStartupInfo;

function SetUserObjectFullAccess(hUserObject: THandle): Boolean;
var
Sd: PSecurity_Descriptor;
Si: Security_Information;
begin
Sd := Ptr(LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH));
InitializeSecurityDescriptor(Sd, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(Sd, True, nil, False);

Si := DACL_SECURITY_INFORMATION;
Result := SetUserObjectSecurity(hUserObject, Si, Sd);

LocalFree(HLOCAL(Sd));
end;
begin
Win32Check(LogonUser(AUserName, ADomain, APassword, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, hToken));
try
ImpersonateLoggedOnUser(hToken);
try
SetUserObjectFullAccess(GetThreadDesktop(GetCurrentThreadId));
SetUserObjectFullAccess(GetProcessWindowStation);

ZeroMemory(@StartupInfo, SizeOf(TStartupInfo));
StartupInfo.cb := SizeOf(TStartupInfo);
StartupInfo.wShowWindow := SW_SHOW;


if not CreateProcessAsUser(hToken, nil, ACommandLine, nil, nil,
False, CREATE_NEW_CONSOLE or CREATE_NEW_PROCESS_GROUP,
nil, nil, StartupInfo, ProcessInfo) then
RaiseLastOsError;
finally
RevertToSelf;
end;
finally
CloseHandle(hToken);
end;
end;

Saludos!

aeff
12-01-2007, 14:33:40
no se si es problema de no entender los parámetros pero no me funciona,
mira el ejemplo dellamada que tomé:

RunAs('C:\WINDOWS\regedit.exe','Alberto',nil, 'nra885');

que crees???

gracias de antemano

delphi.com.ar
12-01-2007, 14:46:26
¿Te produce algún error?.. ¿No hace nada?... ¿Que windows utilizas?...
Ese código yo lo utilizo en una aplicación mía, pero esta plagado de compilación condicional, así que lo limpié un poco.

fdelamo
12-01-2007, 14:56:21
Yo eso lo usé hace algún tiempo (no tengo el código aquí), pero recuerdo que además el usuario debía tener dos permisos especiales (uno era asignar memoria para otro usuario y el otro no recuerdo), no se si irán por ahí los tiros

A ver si tengo un poco de tiempo y busco el código

Un saludo

delphi.com.ar
12-01-2007, 15:03:26
Bueno si.. es importante que el usuario tenga los permisos suficientes inlcusive los del file system. Por el ejemplo que da aeff no creo que venga por ahí el problema, pero no esta de mas aclararlo.

Saludos!

aeff
12-01-2007, 16:18:37
mira, en una de las líneas tu pones esto "RaiseLastOsError;", es ahí donde único me presenta errores, lo pongo en comentarios "//" y continuo con la ejecución del programa, y cuando hago la llamada a la función RunAS, no sucede nada, uso Windows XP

saludos!!!

delphi.com.ar
12-01-2007, 16:25:10
Te presenta errores de compilación o errores en ejecución???...
Si es errores en ejecución, para eso esta esa línea y si sería buenísimo que nos digas que error.
Si no compila, porque no encuentra esa función, posiblemente tienes una versión de Delphi antigua, cambia esa función por RaiseLastWin32Error.

Si quieres una mano, sería bueno un poco mas de empeño en tus respuestas!!!

fdelamo
15-01-2007, 10:05:12
Al fin encontré el código. Te aseguro que funcionaba, pero usaba la función CreateProcAsUserEx de JEDI, de la forma
CreateProcAsUserEx('DOMINIO', 'USUARIO', 'PASSWORDDELUSUARIO',
'miprograma.exe con sus parametros');

y los permisos que debe tener el usuario son:

Herramientas administrativas->Directiva de seguridad local->Directivas locales->Asignacion de derechos de usuarios
- Ajustar cuotas de memoria para un proceso y
- Reemplazar un testigo a nivel de proceso

Ten en cuenta que el segundo permiso no viene por defecto ni al administrador (por lo menos en mi instalación), así que habrá que ponerlos para cada usuario.

Espero que te sirva de algo

Un saludo

SOAD_
19-01-2007, 10:01:22
hola:
Las funciones CreateProcessAsUser y CreateProcessAsUserEx sin dudas funcionan pero requieren una serie de privilegios q las hacen algo inconvenientes en algunos casos(por no decir la mayoria de los casos)....

Te recomiendo q uses CreateProcessWithLogon la cual se encuentra en una dll del sistema a partir de Win 2000, con la cual no es necesario q el usuario tenga ningun pivilegio fuera de los q tiene por defecto, aki un corto segmento de codigo:

function CreateProcessWithLogon; external advapi32 name 'CreateProcessWithLogonW';

info_ini.cb := SizeOf(TStartupInfo);

CreateProcessWithLogon( 'user@domain',
'',
'pass',
1, //cargar o no el profile del usuario
'iexplore.exe',
nil,
CREATE_DEFAULT_ERROR_MODE,
nil,
nil,
info_ini, //de tipo Tstartupinfo
process_info)// de tipo PROCESS_INFORMATION


El codigo no es nada completo por razones de tiempo pero espero q te fucione cualquier duda o error planteala aki para ver q se hace...

Por cierto soy nuevo aki en el Club espero poder ayudar en algo y lo mas importante aprender mucho....
Saludos SOAD