如何在Windows 10任务计划程序的锁屏/解锁触发事件中向PowerShell脚本传递PC名称与用户名参数
如何在Windows 10任务计划程序的锁屏/解锁触发事件中向PowerShell脚本传递PC名称与用户名参数
我之前也碰到过类似的需求,刚好可以分享下可行的方案——其实不需要在任务计划里手动传递参数,我们可以通过脚本直接获取目标信息,或者从系统事件日志里提取触发事件的详情,下面分步骤说明:
一、配置任务计划程序的触发条件
- 打开「任务计划程序」,点击右侧「创建任务」:
- 常规选项卡:给任务起个名字(比如“工作站状态监控”),勾选「使用最高权限运行」(读取安全日志需要权限),选择「只有在用户登录时运行」
- 触发器选项卡:点击「新建」,在「开始任务」下拉框里选择「工作站锁定」,点击确定;再新建一个触发器,选择「工作站解锁」,这样两种事件都会触发任务
- 操作选项卡:点击「新建」,「程序/脚本」填
powershell.exe,「添加参数」填-File "C:\你的脚本路径\WorkstationMonitor.ps1"(注意替换成你实际的脚本路径)
二、编写PowerShell脚本获取PC名称与操作用户
这里有两种可靠的方式获取所需参数:
方式1:直接读取系统环境变量(适合单用户场景)
如果你的机器一般只有单个用户使用,脚本可以直接读取系统内置的环境变量来获取信息:
# 获取计算机名称 $pcName = $env:COMPUTERNAME # 获取当前登录的用户名(锁屏/解锁操作的发起用户) $userName = $env:USERNAME # 这里添加你需要的业务逻辑,比如记录日志 "$(Get-Date): 计算机[$pcName] 被用户[$userName] $(if ($MyInvocation.MyCommand.Name) { # 结合事件日志补全操作状态 $event = Get-WinEvent -FilterHashtable @{LogName='Security';ID=4800,4801} -MaxEvents 1 if ($event.Id -eq 4800) { "锁定" } else { "解锁" } })" | Out-File "C:\Logs\WorkstationLog.txt" -Append
方式2:从安全日志提取触发事件的详情(适合多用户共用机器场景)
如果是多人共用一台机器,比如用户A锁屏,用户B解锁,需要精准获取触发对应事件的用户,就需要读取系统安全日志的事件记录:
# 筛选最新的工作站锁定(ID4800)/解锁(ID4801)事件 $latestEvent = Get-WinEvent -FilterHashtable @{ LogName = 'Security' ID = 4800, 4801 } -MaxEvents 1 -ErrorAction SilentlyContinue if ($latestEvent) { $pcName = $latestEvent.MachineName # 事件的第二个属性值就是操作的用户名 $userName = $latestEvent.Properties[1].Value $actionType = if ($latestEvent.Id -eq 4800) { "锁定" } else { "解锁" } # 执行你的业务逻辑,比如输出日志或发送通知 Write-Host "[$(Get-Date)] 计算机 $pcName 被用户 $userName 执行了$actionType操作" } else { Write-Warning "未找到最近的工作站锁定/解锁事件记录" }
三、注意事项
- 确保脚本路径和日志路径(如果用到)的权限设置正确,任务执行的用户有权限读取和写入
- 如果任务执行后看不到控制台输出,可以在脚本里把输出写入文件,方便排查问题
- 测试时可以手动锁屏/解锁,然后查看任务计划程序的「历史记录」选项卡,确认任务是否正常触发
备注:内容来源于stack exchange,提问作者CAIB-scay-lact
相关产品推荐
相关产品推荐

