¿Cómo identificar qué usuario activó la tarea?

¿Cómo identificar qué usuario activó la tarea?

Me gustaría tener una tarea programada que se ejecute como SYSTEMpero que se active mediante a user actiony 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.

ingrese la descripción de la imagen aquí

Pruebe la XMLexportació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:usernameno 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 qusercomando 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

Recursos adicionales

información relacionada