PDA

Ver la Versión Completa : RunAS


Irma
20-02-2008, 18:13:02
Hola a todos, necesito instalar un exe con permisos de administrados, al utilizar runas me funciona todo bien, pero no quiero q me solicite password, este debe ser transparente.

Les agradeciaria me ayudaran

ixMike
20-02-2008, 18:21:10
pero no quiero q me solicite password

Me parece que así incurriríamos en un fallo de seguridad en el sistema, ¿no?


Salu2.

Irma
20-02-2008, 19:03:25
Gracias ixMike por responderme, disculpa creo que no supe explicarme, al instalar el exe con un usuario sin privilegios de Admin me da error de instalacion (crear un directorio en c:/ y grabar en este el exe). No quiero que estos usuarios restringidos sepan el "password de administrador". Por eso es que lo ejecuto con RunAs.

Utilizo este Codigo

function TForm1.RunExe2(Cmdline: string): boolean;
var
Startupinfo : TStartupinfo;
Processinfo : TProcessinformation;
parametros : String;
begin
Fillchar(Startupinfo,Sizeof(TStartupinfo),0);
with startupinfo do
begin
cb := sizeof(tstartUPinfo);
dwflags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK or STARTF_USESTDHANDLES;
WSHOWWINDOW := SW_SHOWNORMAL;
end;
result := CreateProcess(nil,PChar(cmdLine), nil, nil, true,NORMAL_PRIORITY_CLASS,nil, nil, Startupinfo, Processinfo);
if booltostr(result) = '0' then Messagebox(0,pchar(SysErrorMessage(GetLastError)),'Message',MB_ICONERROR);
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
RunExe2('"C:\Windows\System32\RunAs.exe" /env /user:Administrator "C:\Facturacion\ProjectFactura.EXE"');
end;

En este codigo algo no funciona bien ......

cHackAll
20-02-2008, 20:40:23
var
si: TStartupInfo = (cb: SizeOf(si); dwFlags: STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK; wShowWindow: SW_SHOWNORMAL);
pi: TProcessInformation;

function CreateProcessWithLogonW(lpUsername, lpDomain, lpPassword: PWideChar; dwLogonFlags: Cardinal;
lpApplicationName, lpCommandLine: PWideChar; dwCreationFlags: Cardinal; lpEnvironment: Pointer; lpCurrentDirectory: PWideChar;
var lpStartupInfo: TStartupInfo; var lpProcessInfo: TProcessInformation): LongBool; stdcall; external 'advapi32';

procedure TForm1.Button1Click(Sender: TObject);
begin
if not CreateProcessWithLogonW('Administrator', nil, '123456', 1, nil, 'cmd', 0, nil, nil, si, pi) then
ShowMessage(SysErrorMessage(GetLastError));
end;

PD: no se por que usas STARTF_USESTDHANDLES si no estas definiendo hStdInput, hStdOutput, ó hStdError, y hasta STARTF_USESHOWWINDOW me suena innecesario pues de todas formas estas usando su Default.

Usa las etiquetas para poner tu código!!!

Saludos

Irma
20-02-2008, 21:49:29
Al instalar ProjectFactura.EXE en las Pc's, no tengo conocimiento de cual el password del usuario Administrador.

jachguate
20-02-2008, 22:47:15
Podes incluir una configuración donde se guarde... aunque eso de guardar la contraseña del administrador no es nada sano.

Finalmente... si el programa requiere permisos de administrador para ejecutarse... pues quien lo haga debiera llamar al administrador cada vez... ¿no te parece?

Hasta luego.

;)

delphi.com.ar
21-02-2008, 19:27:38
Te recomiendo ver la función RunAs (http://www.clubdelphi.com/foros/showpost.php?p=176758&postcount=2) que he subido al foro hace tiempo, con esta función no sería necesario utilizar la consola para crear procesos con otro usuario ya que utliza la función CreateProcessAsUser.

Saludos!

alquimista
24-02-2008, 23:58:37
¿con RunAs es necesario ejecutar tu exe a través de un loader o launcher? ¿es posible que una aplicación se ejecute con privilegios de admin con su propio código?

con respecto a que no se vea la pass de admin se podría pasar encriptada ,no?

jachguate
25-02-2008, 16:00:10
¿es posible que una aplicación se ejecute con privilegios de admin con su propio código?

Lo que se me ocurre es que tu aplicación haga algo como esto:



if NoEsAdministrador then
begin
RunAs(YoMismo, Administrador, contraseña);
Terminar;
end;


Hasta luego.

;)

alquimista
04-03-2008, 02:06:22
no entiendo ese código.

Yomismo se refiere a un exe o a que?

Puedes ser mas claro por favor.

jachguate
04-03-2008, 02:22:06
Por YoMismo quise decir, la propia aplicación...

Para ser mas formales:


if not UsuarioAdministrador() then
begin
RunAs(Application.ExeName, FUsuarioAdministrador, FPasswordAdministrador);
Application.Terminate();
end;


¿es lo suficientemente claro ahora?

alquimista
06-03-2008, 20:06:23
Luego debes de crear una aplicación A que ejecute a la aplicación B que es la que queremos que tenga privilegios de admin
.
Mi pregunta era si B puede iniciarse a ella misma con un proceso RunAs pero desde su propio código?

Programa B.exe
...
if not admin then
EjecutateComoAdmin(B.EXE,etc..)
...
end.


Esto es posible??

jachguate
07-03-2008, 02:28:50
Mi pregunta era si B puede iniciarse a ella misma con un proceso RunAs pero desde su propio código?

Programa B.exe
...
if not admin then
EjecutateComoAdmin(B.EXE,etc..)
...
end.



Es justamente lo que hace el trozo de código que te envié... :rolleyes::rolleyes:

alquimista
25-03-2008, 17:52:59
Bueno he hecho pruebas con el RunAs
y me da un error de excepción Code 1314
EOSError Code:_1314.
"El cliente no dispone de un privilegio requerido."

en una cuenta de administrador en XP SP2 dentro de la función RunAs
procedure TForm6.BitBtn1Click(Sender: TObject);
begin

RunAs(PChar(Application.ExeName),PChar(Edit2.text) ,(*PChar(Edit4.text)*)nil , PChar(Edit3.text));
try
ListBox1.Items.SaveToFile('prueba.txt');
except
Edit1.text:='error';
end;
end;Alguna sugerencia.
He puesto el user y password en editbox y el dominio como nil (ordenador sin dominio, supongo)
Si se deben cambiar privilegios
¿Cuales son?
¿Se puede hacer todo desde Delphi de manera automática?