¿Cómo ejecutar un programa automáticamente como administrador en Windows 7 al inicio?

82

Creé mi propia aplicación de control parental para monitorear la actividad de mis hijos. La única interfaz gráfica de usuario de la aplicación es un icono de la barra de tareas. El programa se instala como administrador. Me gustaría que este programa se inicie automáticamente como usuario administrador al iniciar Windows, de modo que los usuarios estándar no puedan eliminarlo desde el administrador de tareas.

Puedo crear una clave de registro en:

HKLM\Software\Microsoft\Windows\CurrentVersion\Run

para que se ejecute automáticamente cuando se inicie Windows. El problema es que el programa se inicia como el usuario registrado (estándar).

¿Cómo puedo hacer que se ejecute en modo elevado? ¿Es esto posible en absoluto en Win7?

hombre nuevo
fuente
1
Un problema quizás mayor es que el programa no se inicia en absoluto si no hay un usuario conectado. Este es un mecanismo para ejecutar un programa al iniciar sesión (como su .loginscript en Unix), no para ejecutarlo en el momento del arranque (como un /etc/rc/...script).
Kaz
@Kaz: En el contexto de esta pregunta, eso no parece ser un problema (a menos que intente observar la interacción de los niños con la pantalla de inicio de sesión)
Ben Voigt

Respuestas:

61

Debe conectarlo al programador de tareas, de modo que se inicie después de que un usuario inicie sesión, utilizando una cuenta de usuario que tenga acceso administrativo al sistema, con los privilegios más altos que se otorgan a los procesos iniciados por esa cuenta.

Esta es la implementación que se utiliza para iniciar procesos con privilegios administrativos al iniciar sesión como un usuario normal.

Lo he usado para iniciar el proceso auxiliar 'OpenVPN GUI' que necesita privilegios elevados para funcionar correctamente y, por lo tanto, no se iniciaría correctamente desde la clave de registro.

Desde la línea de comandos, puede crear la tarea a partir de una descripción XML de lo que desea lograr; entonces, por ejemplo, tenemos esto, exportado desde mi sistema, que iniciaría el bloc de notas con los privilegios más altos cuando inicio sesión:

<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
  <RegistrationInfo>
    <Date>2015-01-27T18:30:34</Date>
    <Author>Pete</Author>
  </RegistrationInfo>
  <Triggers>
    <LogonTrigger>
      <StartBoundary>2015-01-27T18:30:00</StartBoundary>
      <Enabled>true</Enabled>
    </LogonTrigger>
  </Triggers>
  <Principals>
    <Principal id="Author">
      <UserId>CHUMBAWUMBA\Pete</UserId>
      <LogonType>InteractiveToken</LogonType>
      <RunLevel>HighestAvailable</RunLevel>
    </Principal>
  </Principals>
  <Settings>
    <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
    <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
    <StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
    <AllowHardTerminate>true</AllowHardTerminate>
    <StartWhenAvailable>false</StartWhenAvailable>
    <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
    <IdleSettings>
      <StopOnIdleEnd>true</StopOnIdleEnd>
      <RestartOnIdle>false</RestartOnIdle>
    </IdleSettings>
    <AllowStartOnDemand>true</AllowStartOnDemand>
    <Enabled>true</Enabled>
    <Hidden>false</Hidden>
    <RunOnlyIfIdle>false</RunOnlyIfIdle>
    <WakeToRun>false</WakeToRun>
    <ExecutionTimeLimit>PT0S</ExecutionTimeLimit>
    <Priority>7</Priority>
  </Settings>
  <Actions Context="Author">
    <Exec>
      <Command>"c:\windows\system32\notepad.exe"</Command>
    </Exec>
  </Actions>
</Task>

y está registrado por un símbolo del sistema de administrador usando:

schtasks /create /tn "start notepad on login" /xml startnotepad.xml

esta respuesta realmente debería trasladarse a uno de los otros sitios de stackexchange, ya que en realidad no es una pregunta de programación per se.

Petesh
fuente
Muchas gracias por la información. Lo probaré y veré cómo funciona.
newman
1
"después del inicio de sesión de un usuario" no es "inicio de Windows".
Kaz
Sí, pero en realidad no tiene una computadora de escritorio para usar hasta que haya iniciado sesión
Petesh
6
@Petesh, ¿cómo consiguió que una aplicación basada en la interfaz de usuario se ejecutara de esta manera? Cuando uso el Programa de tareas, puedo hacer que una aplicación se ejecute, pero no veo su interfaz de usuario.
Gonzobrains
Me preguntaba si hay alguna forma de hacer esto mediante cambios en el registro. En caso afirmativo, podría programarse incluso sin (antes) iniciar el sistema operativo.
Sopalajo de Arrierez
40
schtasks /create /sc onlogon /tn MyProgram /rl highest /tr "exeFullPath"
msPark
fuente
2
¿No se ejecutará en la sesión 0 y no podrá ver la interfaz de usuario? Quería lo mismo y lo hizo, pero se estaba ejecutando en la sesión 0 con mi nombre de usuario y, por lo tanto, la interfaz de usuario no estaba disponible
Gautam
4
"onlogon" no es el inicio de Windows.
Kaz
1
En Windows 7, se ejecuta en el escritorio del usuario. Pruébelo con calc.exe.
Vladimir Panteleev
1
@CyberShadow Estoy tratando de hacer esto con una aplicación que requiere derechos de administrador. Lo veo en el administrador de tareas pero su interfaz de usuario no es visible.
Gonzobrains
2
Gracias por la respuesta. Nuestro departamento de TI recientemente obligó a UAC a ON a través de la política de grupo para todas las computadoras en el dominio de nuestra empresa. Con la triste consecuencia de que si ejecuta un símbolo del sistema como administrador, las asignaciones de su unidad no estarán disponibles. Anteriormente, había configurado un archivo .bat corto para que se ejecutara al iniciar sesión mediante la clave de registro "ejecutar" que configuraría todas las asignaciones de mi unidad. Necesitaba una forma de ejecutar un .bat similar para la cuenta SYSTEM al inicio. "schtasks / ru SYSTEM" es exactamente lo que necesitaba.
Die in Sente
15

Esto no es posible.
Sin embargo, puede crear un servicio que se ejecute bajo un usuario administrativo.

El servicio puede ejecutarse automáticamente al inicio y comunicarse con su aplicación existente.
Cuando la aplicación necesita hacer algo como administrador, puede pedirle al servicio que lo haga.

Recuerde que se pueden iniciar sesión varios usuarios a la vez.

SLaks
fuente
muchas gracias por la pronta respuesta. En realidad, intenté ejecutar la aplicación desde un servicio de Windows, pero no pude hacerlo funcionar. Pude ver el programa en el administrador de tareas (como usuario del SISTEMA), pero el icono no aparece en la barra de tareas. Cuando agrego Verb = "runas" a StartInfo, obtengo una excepción "No hay suficiente almacenamiento disponible para procesar este comando". Supongo que puede deberse a que no hay forma de abrir una GUI para pedir confirmación al usuario.
Newman
8
@miliu: Un servicio no puede interactuar con el usuario. Necesitas hacer dos programas que se comuniquen entre sí.
SLaks
6

Creo que usar el programador de tareas para iniciar programas automáticamente no es muy fácil de usar y, a veces, ha tenido efectos secundarios para mí (por ejemplo, no se agrega el icono de bandeja de un programa).

Para remediar esto, he creado un programa llamado Elevated Startup que primero se reinicia con privilegios de administrador, luego lanza todos los archivos en un directorio. Dado que Elevated Startup ahora está elevado, todos los programas que lanza también tienen privilegios de administrador. El directorio está en el menú de inicio al lado del directorio de inicio clásico y funciona de manera muy similar.

Es posible que encuentre un cuadro de diálogo de UAC cuando el programa se reinicie, según la configuración de UAC.

Puede obtener el programa aquí: https://stefansundin.github.io/elevatedstartup/

stefansundin
fuente
dado que esta es la respuesta reciente, me gustaría agregar un comentario. Estoy tratando de hacer lo mismo que el OP con mi programa usando el programador de tareas en Windows 10. Sin embargo, inicia mi programa como un proceso en segundo plano que no es lo que quiero. Quiero que mi aplicación se inicie normalmente como administrador. ¿Su programa tiene esto en cuenta?
Jueves
Creo que lo haría. El programa debería iniciarse como si hiciera clic derecho en el acceso directo y utilizara "Ejecutar con privilegios de administrador". Si no se comporta como usted desea, me complacerá saber más sobre su caso de uso y hacer que el programa funcione para usted.
stefansundin
3

Configuración de la compatibilidad de su aplicación a administrador (Run theprogram as an administrator).

Conéctelo task schedulery apáguelo UAC.

Wawan
fuente
Yo también tengo el mismo problema. La interfaz de usuario no es visible. Cualquier ayuda
Senthil Muthiah
1
@SenthilMuthiah Eso es porque su programa se ejecuta como un proceso en segundo plano, no como una aplicación. A mi me pasó lo mismo.
Jueves
3

Puede hacer esto instalando la tarea mientras se ejecuta como administrador a través de la biblioteca TaskSchedler . Estoy asumiendo aquí que .NET / C # es una plataforma / lenguaje adecuado dadas sus preguntas relacionadas.

Esta biblioteca le brinda acceso granular a la API del Programador de tareas, por lo que puede ajustar configuraciones que de otro modo no podría establecer a través de la línea de comando llamando schtasks, como la prioridad de inicio. Al ser una aplicación de control parental, querrá que tenga una prioridad de inicio de 0 (máxima), lo schtasksque creará de forma predeterminada una prioridad de 7.

A continuación se muestra un ejemplo de código de instalación de una tarea de inicio configurada correctamente para ejecutar la aplicación deseada como administrador indefinidamente al iniciar sesión. Este código instalará una tarea para el mismo proceso desde el que se ejecuta.

/*
Copyright © 2017 Jesse Nicholson  
This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/

/// <summary>
/// Used for synchronization when creating run at startup task.
/// </summary>
private ReaderWriterLockSlim m_runAtStartupLock = new ReaderWriterLockSlim();

public void EnsureStarupTaskExists()
{
    try
    {
        m_runAtStartupLock.EnterWriteLock();


        using(var ts = new Microsoft.Win32.TaskScheduler.TaskService())
        {
            // Start off by deleting existing tasks always. Ensure we have a clean/current install of the task.
            ts.RootFolder.DeleteTask(Process.GetCurrentProcess().ProcessName, false);

            // Create a new task definition and assign properties
            using(var td = ts.NewTask())
            {
                td.Principal.RunLevel = Microsoft.Win32.TaskScheduler.TaskRunLevel.Highest;
                // This is not normally necessary. RealTime is the highest priority that
                // there is.
                td.Settings.Priority = ProcessPriorityClass.RealTime;
                td.Settings.DisallowStartIfOnBatteries = false;
                td.Settings.StopIfGoingOnBatteries = false;
                td.Settings.WakeToRun = false;
                td.Settings.AllowDemandStart = false;
                td.Settings.IdleSettings.RestartOnIdle = false;                    
                td.Settings.IdleSettings.StopOnIdleEnd = false;
                td.Settings.RestartCount = 0;                    
                td.Settings.AllowHardTerminate = false;
                td.Settings.Hidden = true;
                td.Settings.Volatile = false;
                td.Settings.Enabled = true;
                td.Settings.Compatibility = Microsoft.Win32.TaskScheduler.TaskCompatibility.V2;
                td.Settings.ExecutionTimeLimit = TimeSpan.Zero;

                td.RegistrationInfo.Description = "Runs the content filter at startup.";

                // Create a trigger that will fire the task at this time every other day
                var logonTrigger = new Microsoft.Win32.TaskScheduler.LogonTrigger();
                logonTrigger.Enabled = true;                    
                logonTrigger.Repetition.StopAtDurationEnd = false;
                logonTrigger.ExecutionTimeLimit = TimeSpan.Zero;
                td.Triggers.Add(logonTrigger);

                // Create an action that will launch Notepad whenever the trigger fires
                td.Actions.Add(new Microsoft.Win32.TaskScheduler.ExecAction(Process.GetCurrentProcess().MainModule.FileName, "/StartMinimized", null));

                // Register the task in the root folder
                ts.RootFolder.RegisterTaskDefinition(Process.GetCurrentProcess().ProcessName, td);
            }
        }                
    }
    finally
    {
        m_runAtStartupLock.ExitWriteLock();
    }
}

fuente
Esa es una biblioteca elegante, aunque solo una nota. Ejecutar algo en "tiempo real" no es necesario la mayor parte del tiempo. Y nunca te deshaces de tdGracias por señalarme en esta dirección.
Andy
1
@Sonic Gracias por el consejo sobre la eliminación. Tienes razón, el "tiempo real" normalmente no es necesario. Este código se copia de un filtro de contenido web de código abierto que escribí, por lo que es necesario que se inicie lo antes posible.
2

Un programa que escribí, farmComm, puede resolver esto. Lo publiqué como código abierto y dominio público.

Si no cumple con sus criterios, es posible que pueda modificarlo fácilmente para hacerlo.

farmComm:

  • Se ejecuta en el arranque bajo un servicio, que continúa cuando los usuarios inician o cierran sesión.
    • En la sesión 0
    • Bajo el usuario "NT AUTHORITY \ SYSTEM".
  • Genera procesos arbitrarios (tú eliges);
    • También en la Sesión 0
    • "De forma invisible" o sin mostrar ninguna interfaz de usuario / GUI
    • Con acceso a hardware de gráficos (por ejemplo, GPU).
    • Responde a la sesión activa, incluso si cambia, incluido el escritorio seguro. Así es como:
    • Solo genera procesos después de que un usuario está inactivo durante 8.5 minutos
    • Termina los engendros cuando un usuario reanuda desde inactivo

Los scripts de origen están disponibles aquí:

https://github.com/r-alex-hall/farmComm

Alex Hall
fuente
2

También debe considerar las implicaciones de seguridad de ejecutar un proceso como usuario de nivel de administrador o como Servicio. Si alguna entrada no se está validando correctamente, como si está escuchando en una interfaz de red. Si el analizador de esta entrada no se valida correctamente, se puede abusar de él y posiblemente conducir a un exploit que podría ejecutar código como el usuario elevado. en el ejemplo de abatishchev, no debería ser un gran problema, pero si se implementara en un entorno empresarial, realice una evaluación de seguridad antes de la implementación a gran escala.

Curtis
fuente
Algunos programas requieren elevación y no necesariamente están sujetos a problemas de seguridad. Por ejemplo, un programa que monitorea la temperatura del sistema y lo muestra en el área de notificación necesitaría elevación para acceder al hardware, y debería ejecutarse automáticamente, pero la seguridad es un punto discutible.
Synetech
-3

Creo que el programador de tareas sería excesivo (en mi humilde opinión). Hay una carpeta de inicio para win7.

C: \ Usuarios \ miliu \ AppData \ Roaming \ Microsoft \ Windows \ Menú Inicio \ Programas \ Inicio

Simplemente cree un acceso directo para su aplicación de inicio automático, edite las propiedades del acceso directo y haga que siempre se ejecute como administrador.

Sus hijos podrían cerrarlo, por supuesto, pero si son expertos en tecnología, siempre encontrarán una manera de mantenerlo fuera. Sé que lo hice cuando era más joven.

¡Buena suerte!

zhengtonic
fuente
6
Esto no funcionará. Windows ignorará los accesos directos de inicio configurados para ejecutarse como administrador.
Vladimir Panteleev
De Verdad? ¿Has probado? Porque está funcionando bien de mi lado. Tengo que iniciar automáticamente mi LogitechSoundManager como administrador para que el sonido envolvente funcione ...
zhengtonic
También tengo este problema, aunque los accesos directos en la carpeta de inicio tienen la opción marcada "ejecutar como administrador", todavía no se cargan al inicio. ¿Alguien sabe alguna forma de solucionar este problema?
ycomp
2
CyberShadow tenía razón, el UAC de la computadora estaba apagado. Los accesos directos de inicio como administrador no funcionan ... uno tiene que usar el programador de tareas
zhengtonic
Encontré al menos en Windows 10 que esto no funciona. Como dijo @ vladimir-panteleev, Windows simplemente parece ignorarlo.
E. van Putten