PowerShell创建计划任务 提示输入凭据填充运行身份参数方法
PowerShell 配置带自定义运行身份的计划任务脚本
实现目标
- 执行脚本时自动提示用户输入对应系统的合法用户名、密码,适配不同设备的凭据差异
- 用户输入完成后,自动将凭据填入计划任务的「运行身份」配置项,完成计划任务注册
- 计划任务每日定时触发,执行
C:\VMStartup\VMHosts.bat批处理文件
初始存在传参问题的脚本
最初编写的版本通过两次Read-Host分别读取用户名、密码,直接传入注册命令时会出现参数类型不匹配的报错,代码如下:
$action = New-ScheduledTaskAction -Execute 'cmd.exe' -Argument 'C:\VMStartup\VMHosts.bat' $trigger1 = New-ScheduledTaskTrigger -Daily -At 00:00am $Username = Read-Host -Prompt "Enter Username" $SecurePassword = Read-Host -Prompt "Enter password" -AsSecureString Register-ScheduledTask -Action $action -Trigger $trigger1 -TaskName VMCheck -Description Populates the VMHost CSV File -User $Username -Password $SecurePassword
问题原因:Register-ScheduledTask的-Password参数要求传入明文字符串格式的密码,直接传入-AsSecureString生成的安全字符串对象会触发参数校验失败;同时单独调用两次输入命令的交互逻辑不符合Windows系统原生凭据输入的使用习惯。
调试后可正常运行的最终版本
修复后改用系统原生凭据弹窗收集用户输入,同时正确提取凭据对象内的明文账号密码匹配参数要求,代码如下:
$action = New-ScheduledTaskAction -Execute 'cmd.exe' -Argument 'C:\VMStartup\VMHosts.bat' $trigger = New-ScheduledTaskTrigger -Daily -At 2am $credential = Get-Credential $username = $Credential.Username $password = $Credential.GetNetworkCredential().Password Register-ScheduledTask -TaskName "VMStartup" -Action $action -Trigger $trigger -Description "Populates the VMHost CSV File" -User $username -Password $password
关键修复点:
- 调用
Get-Credential弹出系统标准的凭据输入窗口,统一收集用户名、密码,交互更规范 - 通过
$Credential.GetNetworkCredential().Password方法解密安全字符串,拿到符合参数要求的明文密码 - 修正了触发器时间格式、任务描述参数的引号包裹问题,避免命令解析异常
内容的提问来源于stack exchange,提问作者Chris Giles
相关产品推荐
相关产品推荐

