Wie kann ermittelt werden, welcher Benutzer die Aufgabe ausgelöst hat?

Wie kann ermittelt werden, welcher Benutzer die Aufgabe ausgelöst hat?

Ich hätte gern eine geplante Aufgabe, die als ausgeführt wird, SYSTEMaber durch ein ausgelöst wird user actionund ist on a delay. Dieser Teil scheint nicht so schwer zu sein.

Der schwierige Teil ist, dass das ausgeführte (PoSh-)Skript erkennen soll, welcher Benutzer die Aufgabe ausgelöst hat. Wie kann ich das erreichen?

Da es sich um eine Verzögerung handelt, ist die Aktion möglicherweise nicht mehr im Spiel. Da die Aufgabenverzögerungen zufällig sind (mit einer maximalen Verzögerung), habe ich keine bestimmte Zeit.

Antwort1

Geplante Aufgabe, die als SYSTEM ausgeführt wird, aber durch eine Benutzeraktion ausgelöst wird und verzögert ist.

Da Sie eine zufällige Verzögerung verwenden und diese aufgrund der Zeiteinteilung problematisch erscheint, sollten Sie einfach für jedes Triggerereignis eine explizite Verzögerung verwenden. Jeder Trigger hat auf diese Weise seine eigene Einstellung für die Verzögerung.

Bildbeschreibung hier eingeben

Versuchen Sie den angehängten XMLExport aus einem Job, den ich auf einem System auf meiner Seite eingerichtet habe und der ein wenig geändert wurde, um echte Skript- und Prozessnamen zu verschleiern.

Sie können es importieren und dann die gesamte Einrichtung und Konfiguration durchsehen, um zu sehen, welche Einstellungen vorgenommen wurden, Anpassungen vornehmen usw.

Aufgabenplanungsauftrag - XML-Export

<?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>

Ich möchte, dass das ausgeführte (PoSh-)Skript erkennen kann, welcher Benutzer die Aufgabe ausgelöst hat

Da der Auslöser der Aufgabe ein Ereignis ist und nicht ein Benutzer, der auf ein Skript klickt, um eine geplante Aufgabe auszuführen, kann das ausgeführte PoSH-Skript nicht erkennen, welcher Benutzer sich pro Ereignis, das es ausführt, angemeldet hat.

Dies bedeutet, dass Sie durch einfaches Protokollieren und Verwenden $env:usernamenicht den Benutzernamen erhalten, der die Anmeldung veranlasst hat, die das Ereignis verursacht hat.

Wie kann ermittelt werden, welcher Benutzer die Aufgabe ausgelöst hat?

Sie müssten wahrscheinlich Daten erfassen vonSicherheitsprotokolle der Ereignisanzeigeum zum Zeitpunkt der Ausführung die Details des Benutzerkontos abzurufen, das sich angemeldet und das Ereignis generiert hat, das den Taskplaner-Job auslöst, und diese in die PoSH-Logik zu integrieren, um ein Protokoll usw. zu speichern.

Möglicherweise können Sie den quserBefehl ausführen, den Benutzernamen der aktiven Sitzung aufzeichnen und ihn auf diese Weise auch gemäß der PoSH-Logik protokollieren.

quser Beispielausgabe

C:\Users\ClownMan>quser
 USERNAME              SESSIONNAME        ID  STATE   IDLE TIME  LOGON TIME
>ClownMan              console             1  Active      none   4/14/2021 7:46 AM

Zusätzliche 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 " ";

Beispielausgabe

Notiz: Mit diesen Werten können Sie den Namen des aktiven Benutzerkontos ermitteln und dann mit PowerShell berechnen, um sicherzustellen, dass Datum und Uhrzeit größer als eine Stunde sind und nur, wenn das Skript gemäß der einstündigen Verzögerungsbedingung ausgeführt werden soll.

ClownMan
Active
4/14/2021 7:46 AM

Zusätzliche Ressourcen

verwandte Informationen