どのユーザーがタスクをトリガーしたかを識別するにはどうすればよいでしょうか?

どのユーザーがタスクをトリガーしたかを識別するにはどうすればよいでしょうか?

SYSTEMとして実行されるが、 によってトリガーされ、 であるuser actionスケジュールされたタスクが必要ですon a delay。その部分はそれほど難しくないようです。

難しいのは、実行される (PoSh) スクリプトで、どのユーザーがタスクをトリガーしたかを識別できるようにすることです。どうすればよいでしょうか?

遅延中なので、アクションは実行されなくなる可能性があります。タスクの遅延はランダム (最大遅延あり) なので、特定の時間はありません。

答え1

SYSTEM として実行されますが、ユーザー アクションによってトリガーされ、遅延されるスケジュールされたタスク。

ランダムな遅延を使用しており、タイミングごとに面倒なようですので、トリガー イベントごとに明示的な遅延を使用する必要があります。このように、各トリガーには遅延の独自の設定があります。

ここに画像の説明を入力してください

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イベントの原因となったログオンしたユーザー名は取得されません。

どのユーザーがタスクをトリガーしたかを識別するにはどうすればよいでしょうか?

おそらく、以下のデータを取得する必要があるでしょうイベント ビューアーのセキュリティ ログ実行時に、ログオンしたユーザー アカウントの詳細を取得して、タスク スケジューラ ジョブをトリガーするイベントを生成し、それを 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 を使用して計算して、日付と時刻が 1 時間を超えていること、および 1 時間の遅延条件ごとにスクリプトが実行される場合にのみ、日付と時刻が 1 時間を超えていることを確認できます。

ClownMan
Active
4/14/2021 7:46 AM

追加リソース

関連情報