【问题标题】:Task scheduler running power shell script - Username error?运行powershell脚本的任务计划程序 - 用户名错误?
【发布时间】:2020-06-02 10:07:32
【问题描述】:

所以我有一个 powershell 脚本,当用户登录 PC 时,它会通过电子邮件将登录的详细信息发送给我,例如用户名、IP、位置等。它从任务调度程序运行并在登录时触发。

脚本通过powershell运行良好我的问题我遇到的问题是,无论谁登录它总是在任务计划程序中的我的帐户上运行脚本,因此总是输入我的名字作为用户名,即使是不同的用户也可能登录。我'已经尝试以多种方式调用用户名,但总是显示我的名字,因为它从我的帐户中消失。

用于调用我使用的用户名:

$username = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name

$env:用户名

$env:用户域

全部返回运行计划任务的用户。

任何帮助它打印已登录的真实用户将不胜感激。

谢谢。

【问题讨论】:

  • 您可以发布一些您尝试过的代码吗?您说您已经尝试了多种方法 - 了解它们是什么会有所帮助,并且会避免有人简单地建议您已经知道不起作用的东西。
  • 当然,对于调用用户名,我尝试的是 - "$username = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name", "$env:UserName"和“$env:UserDomain”。全部返回正在运行计划任务的用户。

标签: powershell task scheduler


【解决方案1】:

这可能是因为您的计划任务正在使用您的凭据执行。可悲的是,没有办法解决这个问题。也就是说,您可以通过获取与 explorer.exe 进程关联的用户帐户来回避这种行为:

$username = Get-WmiObject Win32_Process -Filter "Name='explorer.exe'" | ForEach-Object { $_.GetOwner() } | Select-Object -Unique -Expand User

这应该可以正常工作,只要您不会遇到多个用户可以同时登录到一台机器的情况(快速用户切换、终端服务等)

编辑:为了得到你想要的东西,你可能需要更多这样的东西

$op = @()
$owners = Get-WmiObject Win32_Process -Filter "Name='explorer.exe'" | ForEach-Object { $_.GetOwner() } | Select-Object -Unique -Expand User
foreach($owner in $owners)
{
    $wmiprocs = get-wmiobject win32_process -filter "Name='explorer.exe'" | where { $_.getowner().user -eq $owner } | select-object processid
    $procs = $wmiprocs | % { get-process -id $_.processid | select-object starttime }
    $obj = new-object object
    $obj | add-member -type noteproperty -name Username $owner
    $obj | add-member -type noteproperty -name Logon ($procs | sort -descending)[0].starttime
    $op += $obj
}

$op | ft -auto

请注意,您的 PowerShell 实例需要以管理员身份运行才能查询其他用户的进程。

【讨论】:

  • 嗨,谢谢。现在它似乎确实跳过了任务计划程序名称,但我相信他们在登录时会列出多个用户。有没有办法把它分解成最新的,还是不可能的?如果没有,我可以通过以不同的方式显示它来使用它。
  • 使用这种方法,它是不可能的。监视事件 id 4624 的安全日志并从事件中提取数据可能会获得更好的结果。同样,您会遇到重新身份验证和令牌刷新事件等,这将使识别真正的登录变得更加困难。
  • 想一想,WMI 对象有一个 ProcessId 属性,它也可以被捕获并传递到 Get-Process -Id cmdlet 以让您访问该对象的 StartTime 属性,然后可以命令该属性检索最新条目(最近启动的进程)
  • 有趣,这可能是我需要研究的东西,因为我想拥有最新的。谢谢您的帮助。目前我正在获取 System.Object[] 作为电子邮件中的输出,我假设因为很多人登录时有多个 IP 等返回。
  • @PaulA 可能会给你一个答案 - 我已经用一个额外的例子更新了我的代码。
猜你喜欢
  • 2020-08-07
  • 2015-07-22
  • 2019-05-02
  • 2015-07-27
  • 1970-01-01
  • 1970-01-01
  • 2017-07-07
  • 2019-05-08
  • 2017-08-01
相关资源
最近更新 更多