Me gustaría tener una tarea programada que se ejecute como SYSTEM
pero que se active mediante a user action
y is on a delay
. Esa parte no parece tan difícil.
La parte difícil es que quiero que el script (PoSh) que se ejecuta pueda identificar qué usuario activó la tarea. ¿Cómo podría hacer eso?
Debido a que está retrasado, es posible que la acción ya no esté en juego. Dado que los retrasos de las tareas son aleatorios (con un retraso máximo), no tengo un tiempo específico.
Respuesta1
Tarea programada que se ejecuta como SISTEMA pero se activa por una acción del usuario y tiene un retraso.
Dado que está utilizando un retraso aleatorio y parece problemático por tiempo, debería utilizar un retraso explícito por cada evento desencadenante. De esta manera, cada disparador tiene su propia configuración para el retraso.
Pruebe la XML
exportación adjunta de un trabajo que configuré en un sistema de mi lado modificado un poco para ocultar los nombres reales de scripts y procesos.
Puede importarlo y luego revisar toda la instalación y configuración para ver cuáles fueron todas las configuraciones, realizar ajustes, etc.
Trabajo del programador de tareas: exportación XML
<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<RegistrationInfo>
<Date>2019-12-10T13:30:30.3849335</Date>
<Author>Administrator</Author>
<URI>\Kill Daemon</URI>
</RegistrationInfo>
<Principals>
<Principal id="Author">
<UserId>S-1-5-18</UserId>
<RunLevel>HighestAvailable</RunLevel>
</Principal>
</Principals>
<Settings>
<DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<IdleSettings>
<StopOnIdleEnd>true</StopOnIdleEnd>
<RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
</Settings>
<Triggers>
<LogonTrigger>
<Delay>PT10S</Delay>
</LogonTrigger>
<SessionStateChangeTrigger>
<Delay>PT10S</Delay>
<StateChange>RemoteConnect</StateChange>
</SessionStateChangeTrigger>
<SessionStateChangeTrigger>
<Delay>PT10S</Delay>
<StateChange>ConsoleConnect</StateChange>
</SessionStateChangeTrigger>
</Triggers>
<Actions Context="Author">
<Exec>
<Command>Powershell</Command>
<Arguments>-ExecutionPolicy Bypass -File "C:\process\killit.ps1"</Arguments>
<WorkingDirectory>C:\process</WorkingDirectory>
</Exec>
</Actions>
</Task>
Quiero que el script (PoSh) que se ejecuta pueda identificar qué usuario activó la tarea.
Debido a que el desencadenante de la tarea es un evento y no un usuario que hace clic en un script para ejecutar una tarea programada, el script PoSH que se ejecuta no puede indicar qué usuario inició sesión según el evento que lo ejecuta.
Esto significa que realizar un simple registro y uso $env:username
no le dará el nombre de usuario que inició sesión y provocó el evento.
¿Cómo identificar qué usuario activó la tarea?
Probablemente tendrías que capturar datos deRegistros de seguridad del Visor de eventosen el momento de la ejecución para obtener los detalles de la cuenta de usuario que inició sesión generando el evento que desencadena el trabajo del Programador de tareas e incorporarlo a la lógica PoSH para guardar un registro, etc.
Es posible que pueda ejecutar el quser
comando y registrar el nombre de usuario de la sesión activa y registrarlo según la lógica PoSH de esa manera también.
salida de ejemplo de quser
C:\Users\ClownMan>quser
USERNAME SESSIONNAME ID STATE IDLE TIME LOGON TIME
>ClownMan console 1 Active none 4/14/2021 7:46 AM
PowerShell adicional
(quser)[1].Split("").Where({$_.Trim() -ne ""})[0] -join " " -replace ">";
(quser)[1].Split("").Where({$_.Trim() -ne ""})[3];
(quser)[1].Split("").Where({$_.Trim() -ne ""})[5..7] -join " ";
Salida de ejemplo
Nota: Con estos valores, puede obtener el nombre de la cuenta de usuario que está activa y luego calcular con PowerShell para garantizar que la fecha y la hora sean mayores a una hora y solo si se va a ejecutar el script según la condición de retraso de una hora.
ClownMan
Active
4/14/2021 7:46 AM