脚本关闭PC,如果用户在PowerShell中处于非活动状态一段时间

lnvxswe2  于 2023-06-29  发布在  Shell
关注(0)|答案(1)|浏览(200)

如果用户处于非活动状态,则自动关机。
我试图创建一个一次性的powershell脚本关闭电脑,如果用户是不活动的一段时间。
我已经做了一些环顾四周,但唯一的答案,我的问题是使用VB。任务计划程序不是答案,因为用户可能会超过2小时处于非活动状态。

oxcyiej7

oxcyiej71#

任务计划程序不是答案,因为用户可能会超过2小时处于非活动状态。
正如Bitcoin Murderous Maniac在评论中指出的那样:虽然任务计划程序GUI(taskschedm.msc)* 表面上 * 将您的最大空闲持续时间限制为2小时,但您实际上 * 可以自由输入更大的值 *(包括单词hours并按Enter键提交):

  • 但是,* 此空闲超时 * 不再支持 *(来自the docs):

Duration和WaitTimeout设置已弃用。它们仍然存在于“任务计划程序”用户界面中,它们的接口方法可能仍然返回有效值,但不再使用。

事实上,从Windows 11 22 H2开始,空闲任务的行为似乎仅限于以下,基于我的实验(如果您发现相反的信息,请告诉我们;链接的文档希望仍然准确地描述了计算机被认为(不)空闲时的条件:

  • 当检测到空闲条件时(最早在硬编码4分钟后发生),该任务会立即启动。
  • 当计算机不再空闲时,启动的任务将立即终止,也就是说,任务计划程序GUI中看似允许任务继续运行的复选框不再有效。
  • 当计算机再次处于空闲状态时,任务将“总是重新启动”-也就是说,任务计划程序GUI中的复选框(看似允许任务在先前终止后“不”重新启动)不再有效。

然而,你 * 可以 * 建立在这些行为上,以实现你想要的

  • 当任务在进入空闲状态时启动时,首先启动等待所需持续时间的Start-Sleep命令,例如5个小时,然后才打电话给Stop-Computer
  • 如果计算机立即保持长时间空闲,则关机将按计划进行。
  • 如果计算机在此之前退出空闲状态,则任务将终止,这样就不会发生过早关机的情况-然后在下次进入空闲状态时重新启动。

以下是设置此类任务的自包含代码

  • 它以NT AUHTORITY\System的形式运行任务,无论用户是否登录。
  • 为了使用此用户身份设置任务,您需要在 elevated 会话中运行代码(以admin身份运行)。
  • 要保证关闭不仅启动而且完成,-Force必须传递给Stop-Computer。但请注意,这意味着用户会话中任何未保存的数据都可能丢失。
  • 不需要PowerShell * 脚本 *(*.ps1文件)-命令通过-Command参数传递给powershell.exe(Windows PowerShell CLI)。
  • 有关更多信息,请参见源代码中的注解。
#requires -RunAsAdministrator

# Specify the number of hours of idle time after which the shutdown should occur.
$idleTimeoutHours = 5
# Specify the task name.
$taskName = 'ShutdownAfterIdling'

# Create the shutdown action.
# Note: Passing -Force to Stop-Computer is the only way to *guarantee* that the
#       computer will shut down, but can result in data loss if the user has unsaved data.
$action = New-ScheduledTaskAction -Execute powershell.exe -Argument @"
  -NoProfile -Command "Start-Sleep $((New-TimeSpan -Hours $idleTimeoutHours).TotalSeconds); Stop-Computer -Force"
"@

# Specify the user identy for the scheduled task:
# Use NT AUTHORIT\SYSTEM, so that the tasks runs invisibly and
# whether or not users are logged on.
$principal = New-ScheduledTaskPrincipal -UserID 'NT AUTHORITY\SYSTEM' -LogonType ServiceAccount

# Create a settings set that activates the condition to run only when idle.
# Note: This alone is NOT enough - an on-idle *trigger* must be created too.
$settings = New-ScheduledTaskSettingsSet -RunOnlyIfIdle

# New-ScheduledTaskTrigger does NOT support creating on-idle triggers, but you 
# can use the relevant CIM class directly, courtesy of this excellent blog post:
# https://www.ctrl.blog/entry/idle-task-scheduler-powershell.html
$trigger = Get-CimClass -ClassName MSFT_TaskIdleTrigger -Namespace Root/Microsoft/Windows/TaskScheduler  

# Finally, create and register the task:
Register-ScheduledTask $taskName -Action $action -Principal $principal -Settings $settings -Trigger $trigger -Force

相关问题