如何在PowerShell 7中触发UAC并捕获输入密码为变量用于计划任务脚本
实现UAC级别的密码输入捕获并用于计划任务注册
要实现弹出类似UAC风格的密码输入对话框并捕获密码到$password变量,你可以结合系统凭据对话框和权限提升检测来完成,具体步骤如下:
1. 检测并提升脚本权限(触发UAC提示)
如果当前脚本未以管理员身份运行,先触发UAC权限提升提示,确保后续操作具备足够权限:
# 检查是否具备管理员权限 if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) { # 以管理员身份重新启动脚本 $startInfo = New-Object System.Diagnostics.ProcessStartInfo "PowerShell.exe" $startInfo.Arguments = "-NoProfile -ExecutionPolicy Bypass -File `"$($MyInvocation.MyCommand.Path)`"" $startInfo.Verb = "runas" [System.Diagnostics.Process]::Start($startInfo) | Out-Null exit }
2. 弹出密码输入对话框并捕获密码
使用Get-Credential弹出系统原生的凭据输入框(视觉风格与UAC一致,安全可靠),并提取明文密码到$password变量:
# 弹出凭据输入对话框,默认用户为Admin $credential = Get-Credential -UserName "Admin" -Message "请输入管理员密码以创建计划任务" # 将SecureString类型的密码转换为明文(Register-ScheduledTask需要明文参数) $password = [System.Net.NetworkCredential]::new("", $credential.Password).Password
3. 整合原有计划任务脚本
将捕获到的$password变量代入你的原有脚本:
$action = New-ScheduledTaskAction -Execute "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -Argument '-file "File.ps1"' $trigger = New-ScheduledTaskTrigger -AtStartup Register-ScheduledTask -Action $action -Trigger $trigger -TaskPath "Tasks" -TaskName "Name" -Description "Description" -User $credential.UserName -Password $password -RunLevel Highest
注意事项
Get-Credential的对话框是系统级别的安全对话框,密码不会被脚本以外的程序捕获,安全性有保障。- 转换明文密码是因为
Register-ScheduledTask的-Password参数仅接受明文格式,完成任务注册后建议立即清空$password变量:$password = $null
内容的提问来源于stack exchange,提问作者user20682592
相关产品推荐
相关产品推荐

