Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-04-2006
Avatar de PoZi
PoZi PoZi is offline
Miembro
 
Registrado: abr 2006
Posts: 11
Poder: 0
PoZi Va por buen camino
Question Dar privilegios de Administrador a la Aplicación

Hola a todos.
Estoy realizando una aplicación de control de acceso para un Pc con XP SP2 donde el usuario que tiene que acceder tiene un perfil limitado (con pocos permisos). Para que la aplicación pudiera escribir en disco le tuve que dar privilegios de administrador con la función CreateProcessWithLogonW de la siguiente forma:

Código Delphi [-]
var 
  StartupInfo: TStartupInfo; 
  ProcessInfo: TProcessInformation; 
begin 
  FillChar (StartupInfo, SizeOf(StartupInfo), #0); 
  StartupInfo.cb := SizeOf(StartupInfo); 
  Win32Check( CreateProcessWithLogonW( StringToOleStr('UsuarioConPermisos'),StringToOleStr ('Dominio'), 
    StringToOleStr('Password'),0, StringToOleStr('Exe'), nil, 0, nil, StringToOleStr('DirectorioTrabajo'), 
    StartupInfo, ProcessInfo ) ); 
end;

En este enlace se define la función CreateProcessWithLogonW:
http://msdn.microsoft.com/library/de...withlogonw.asp

De esta forma la aplicación puede escribir en disco con toda libertad mientras que el usuario no.
Pues bien a partir de ese momento la función: ExitWindowsEx(EWX_FORCE,0); que utilizaba para cerrar la sesión cuando el tiempo de acceso al sistema se ha sobrepasado dejó de funcionar . Lo único que hace es cerrar la aplicación pero el Pc no hace un logoff.
He probado todas la formas que conozco para cerrar la sesión y no lo consigo.
Gracias de antemano.


Última edición por PoZi fecha: 26-04-2006 a las 14:14:54.
Responder Con Cita
  #2  
Antiguo 05-04-2006
Avatar de Bicho
[Bicho] Bicho is offline
Miembro Premium
 
Registrado: jul 2003
Ubicación: Inca - Mallorca
Posts: 1.776
Poder: 22
Bicho Va por buen camino
Hola PoZi, no se mucho del tema, pero podría ser que necesitaras cerrar el proceso, que tú aplicación se cierra correctamente, pero windows no se cierra porque está esperando a que se termine el procese, es posible eso?

Revisa ésta página a la que he llegado desde tú enlace alomejor te sirve.

http://msdn.microsoft.com/library/de..._a_process.asp

Saludos
Responder Con Cita
  #3  
Antiguo 05-04-2006
Avatar de PoZi
PoZi PoZi is offline
Miembro
 
Registrado: abr 2006
Posts: 11
Poder: 0
PoZi Va por buen camino
Thumbs down Probado

Buenas.
He intentado hacer lo que me has indicado Bicho (por cierto gracias por responder tan rápido) y sigue haciendo lo mismo.
Lo que he hecho es crear una aplicación con el siguiente código:
Código Delphi [-]
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  ExitWindowsEx(EWX_FORCE,0);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
  HProceso: THandle;
begin
  HProceso:=GetCurrentProcess();
  try
    TerminateProcess(HProceso,0);
  finally
    CloseHandle(Handle);
  end;
end;

y arrancarlo dándole permisos de administrador utilizando CreateProcessWithLogonW. Sin embargo la aplicación se cierra pero windows se queda tan pancho.
Saludos

Última edición por PoZi fecha: 26-04-2006 a las 14:15:55.
Responder Con Cita
  #4  
Antiguo 06-04-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Código Delphi [-]
function TFrmteclas.ShutDownWindows(Flag: Word): Boolean;
var
  TokenPriv: TTokenPrivileges;
  H:         DWord;
  HToken:    THandle;
begin
  if Win32Platform = VER_PLATFORM_WIN32_NT then
  begin
    OpenProcessToken(GetCurrentProcess,
      TOKEN_ADJUST_PRIVILEGES, HToken);
    LookUpPrivilegeValue(NIL, 'SeShutdownPrivilege',
      TokenPriv.Privileges[0].Luid);
    TokenPriv.PrivilegeCount := 1;
    TokenPriv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
    H := 0;
    AdjustTokenPrivileges(HToken, FALSE,
      TokenPriv, 0, PTokenPrivileges(NIL)^, H);
    CloseHandle(HToken);
  end;
  Result := ExitWindowsEx(Flag, 0);
end;

Opciones:
Código Delphi [-]
  ShutDownWindows(EWX_POWEROFF); // apagar windows
  ShutDownWindows(EWX_REBOOT); // reiniciar windows

  ShutDownWindows(EWX_POWEROFF or EWX_FORCE); // forzar apagado
  ShutDownWindows(EWX_REBOOT or EWX_FORCE); // forzar reiniciado

  shutdownwindows(EWX_LOGOFF); // cerrar session

Con la opción "Forzar" ningun programa puede denegar el apagado del sistema. Si hay cambios que no se han guardado en Word, directamente se pierden

Probado en Windows XP Sp2

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #5  
Antiguo 06-04-2006
Avatar de PoZi
PoZi PoZi is offline
Miembro
 
Registrado: abr 2006
Posts: 11
Poder: 0
PoZi Va por buen camino
Unhappy Sigue sin funcionar

Hola
Muchas Gracias por ayudarme Lepe.
Lo que me dices ya lo había probado yo, pero por si acaso lo volví a probar, y nada, sigo sin poder hacer un logoff del Pc; lo único que
me funciona es ShutDownWindows(EWX_REBOOT); y ShutDownWindows(EWX_POWEROFF); . No sé que estaré haciendo mal:
Creo un form con 2 botones:
Código Delphi [-]
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  ShutDownWindows(EWX_LOGOFF or EWX_FORCE);
end;
 
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
  ShutDownWindows(EWX_FORCE);
end;
 
function TForm1.ShutDownWindows(Flag: Word): Boolean;
var
  TokenPriv: TTokenPrivileges;
  H: DWord;
  HToken: THandle;
begin
  if Win32Platform = VER_PLATFORM_WIN32_NT then
    begin
      OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, HToken);
      LookUpPrivilegeValue(NIL, 'SeShutdownPrivilege', TokenPriv.Privileges[0].Luid);
      TokenPriv.PrivilegeCount := 1;
      TokenPriv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
      H := 0;
      AdjustTokenPrivileges(HToken, FALSE, TokenPriv, 0, PTokenPrivileges(NIL)^, H);
      CloseHandle(HToken);
    end;
  Result := ExitWindowsEx(Flag, 0);
end;

y el ejecutable Project1.exe lo meto en la carpeta C:\Prueba. Creo una aplicación que arranca Project1.exe con privilegios de administrador:
Código Delphi [-]
function CreateProcessWithLogonW(
  lpUsername,lpDomain,lpPassword: PWideChar;
  dwLogonFlags: Dword;
  lpApplicationName: PWideChar;
  lpCommandLine: PWideChar;
  dwCreationFlags: Dword;
  lpEnvironment: Pointer;
  lpCurrentDirectory: PWideChar;
  const lpStartupInfo: tSTARTUPINFO;
  var lpProcessInformation: TProcessInformation): BOOL ; stdcall; external 'advapi32.dll';
begin
  { TODO -oUser -cConsole Main : Insert code here }
  FillChar (StartupInfo, SizeOf(StartupInfo), #0);
  StartupInfo.cb := SizeOf(StartupInfo);
  CreateProcessWithLogonW(StringToOleStr('UsuarioConPermisos'), nil, StringToOleStr('Contraseña'), 0, 
    StringToOleStr('C:\Prueba\Project1.exe'), nil, 0, nil, StringToOleStr('C:\Prueba'), 
    StartupInfo, ProcessInfo);
end.

Lo ejecuto, se inicia el form y al pulsar a alguno de los botones lo único que ocurre es que el form se cierra ; el guindols ni se inmuta ...
Muchas gracias y perdonen las molestias.

Última edición por PoZi fecha: 03-05-2006 a las 20:52:16.
Responder Con Cita
  #6  
Antiguo 06-04-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Acabo de probar el código de BitBtn1 y efectivamente me cierra la sessión abortando los programas en ejecución.

El BitBtn2 no debe funcionar jejeje.

Cita:
Empezado por Ayuda de ExitWindowsEx
EWX_LOGOFF Shuts down all processes running in the security context of the process that called the ExitWindowsEx function. Then it logs the user off.

EWX_POWEROFF Shuts down the system and turns off the power. The system must support the power-off feature.Windows NT: The calling process must have the SE_SHUTDOWN_NAME privilege. For more information, see the following Remarks section.
Según interpreto, que puedo estar equivocado. El contexto de tu aplicación no es la misma que el resto de procesos, ya que has usado el "lanzador" para que tenga permisos de administrador.

como ves el POWEROFF no dice nada del contexto de seguridad.... dice que debe tener el privilegio SE_SHUTDOWN_NAME, que precisamente es el que se le da en la rutina que te dí.

Ejecuta el programa directamente sin el lanzador y cuentanos si cierra la sesion.
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Dar privilegios del SYSDBA a otro usuario Eolo Firebird e Interbase 3 21-03-2004 05:48:15
Roles - Usuarios y privilegios Osorio Firebird e Interbase 2 13-02-2004 23:34:31
Privilegios en interbase acrophet Conexión con bases de datos 1 09-02-2004 15:07:35


La franja horaria es GMT +2. Ahora son las 18:24:29.


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