0 3 mins 1 semana

Este código permite que nuestro programa corra con privilegios de SYSTEM en Windows XP. Para ello debe ser ejecutado por un usuario administrador; desde una cuenta limitada no funcionará. Comprender el funcionamiento de este código requiere conocer el comando AT de XP y su uso en escaladas de privilegio. No toco el tema aquí porque está bien tratado en muchos documentos. Sólo hay que saber que todo lo que AT ejecute lo hará como SYSTEM.

No sé cómo trabajará fuera de XP. De cualquier forma, sería bueno verificar la versión del sistema operativo en que se está antes de llamar la función. No he tenido oportunidad aún de darle uso a este código, de modo que me he limitado sólo a hacerle algunas pruebas. Si alguien detecta algún bug o comportamiento inapropiado le agradecería que me lo hiciera saber. También, si alguien se toma la molestia de probarlo fuera de XP, sería bueno que me informaran los resultados.

Llama a esta función desde el OnCreate de tu formulario y corre el programa. Inmediatamente se cerrará y si esperas un minuto o menos verás cómo se vuelve a abrir por sí mismo; esta vez en la lista de procesos verás Nombre de Usuario «SYSTEM».

void RunAsSystem()
{
  char Buffer[100];
  DWORD dwSize = 100;
  GetUserNameA(Buffer,&dwSize);

   //si el nombre de usuario actual es distinto de SYSTEM
  if (strcmp(Buffer,"SYSTEM"))
  {
    TTime CurrentTime;
    CurrentTime = Time();
       //tomas los datos de la hora actual
    int Hour = StrToInt(CurrentTime.FormatString("h"));
    int Minutes = StrToInt(CurrentTime.FormatString("n"));
    String sM = CurrentTime.FormatString("a/p");
       //formato del comando para ejecutarse un minuto después que se escribió
       // at hh:mm+1 /interactive programa.exe
    String AtTime = IntToStr(Hour)+":"+IntToStr(Minutes+1) ;
    String CommandLine = "at "+ AtTime + " /interactive \"" + Application->ExeName + "\"";
    WinExec( CommandLine.c_str() ,SW_HIDE);
    Application->Terminate();
  }
  else
  {

   //limpia la lista de tareas si ya se está como SYSTEM
  WinExec("at /del /y",SW_HIDE);
  }
}

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *