Как определить, какой пользователь запустил задачу?

Как определить, какой пользователь запустил задачу?

Я хотел бы иметь запланированную задачу, которая выполняется как, SYSTEMно запускается с помощью user actionи является on a delay. Эта часть не кажется такой уж сложной.

Сложность в том, что я хочу, чтобы скрипт (PoSh), который запускается, мог определить, какой пользователь запустил задачу. Как мне это сделать?

Поскольку он находится на задержке, действие может быть уже не в игре. Поскольку задержки задач случайны (с максимальной задержкой), у меня нет определенного времени.

решение1

Запланированная задача, которая выполняется как СИСТЕМА, но запускается действием пользователя и выполняется с задержкой.

Поскольку вы используете случайную задержку, и это, похоже, проблематично по времени, вам следует просто использовать явную задержку для каждого события триггера. Таким образом, каждый триггер имеет свою собственную настройку для задержки.

введите описание изображения здесь

Попробуйте приложенный XMLэкспорт из задания, которое я настроил в системе на своей стороне, немного изменив его, чтобы скрыть реальные имена сценариев и процессов.

Вы можете импортировать его, а затем просмотреть все настройки и конфигурации, чтобы увидеть, какие параметры были установлены, внести коррективы и т. д.

Задание планировщика задач — экспорт 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>

Я хочу, чтобы запущенный скрипт (PoSh) мог определить, какой пользователь запустил задачу.

Поскольку триггером задачи является событие, а не нажатие пользователем на скрипт для выполнения запланированной задачи, выполняемый скрипт PoSH не может определить, какой пользователь вошел в систему в соответствии с событием, которое его выполняет.

Это означает, что выполнение простого входа в систему и использование $env:usernameне дадут вам имя пользователя, вошедшего в систему и вызвавшего событие.

Как определить, какой пользователь запустил задачу?

Вам, вероятно, придется собирать данные изЖурналы безопасности Event Viewerво время выполнения, чтобы получить данные учетной записи пользователя, вошедшего в систему, сгенерировавшего событие, которое запускает задание планировщика задач, и включить это в логику PoSH для сохранения журнала и т. д.

quserВы также можете выполнить команду и записать имя пользователя активного сеанса, а затем зарегистрировать его в соответствии с логикой PoSH.

пример вывода 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

(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 " ";

Пример вывода

Примечание: Используя эти значения, вы можете получить имя активной учетной записи пользователя, а затем выполнить расчет с помощью PowerShell, чтобы убедиться, что дата и время больше одного часа, и только в этом случае скрипт будет запущен в соответствии с условием задержки в один час.

ClownMan
Active
4/14/2021 7:46 AM

Дополнительные ресурсы

Связанный контент