Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Api CreateProcessAsUser (https://www.clubdelphi.com/foros/showthread.php?t=39170)

aeff 12-01-2007 05:37:27

Api CreateProcessAsUser
 
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:
Código Delphi [-]
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

hmmmmmmm!!!
 
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

bueeeno
 
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
Código Delphi [-]
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

Espero q te sirva
 
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:
Código:

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


La franja horaria es GMT +2. Ahora son las 02:18:14.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi