RunOnce 键用于启动提升的 .ps1 文件

RunOnce 键用于启动提升的 .ps1 文件

因此,几天来我一直在研究 powershell 中的自动化脚本,该脚本启动提升 -> 更改 pc 名称 -> 创建 RunOnce reg 文件,并以此行作为值(程序会根据文件位置自动更改它)"Powershell.exe -executionPolicy Unrestricted -file " + [string]$path + "\PCSetup.ps1 -check n"-> 重新启动 pc。之后它应该会自动启动应用程序并继续提升。据我所知,reg 键执行 CMD 并粘贴在 Value 中指定的字符串(如下所示Powershell.exe -executionPolicy Unrestricted -file C:\Users\user\Desktop\PCSetup.ps1 -check n

现在,我知道保存的 cmdlet 在提升的 cmd 中运行有效,但在普通 cmd 中运行无效(或 reg 文件使用的任何程序),但如何在 reg 文件中自动提升它?我也尝试在任务计划程序中创建和注册新实例,但无法将变量传递给设置文件(使用相对路径)来执行。

作为额外信息:-check 选项是执行相同的脚本并自动跳过重命名部分程序

我也尝试使用 -command 而不是 -file

我也尝试使用 -verb RunAs,但它会抛出一个错误(对我来说,这是在 cmd 中运行密钥的原因之一)

我尝试用多种可能的方法寻找这个问题,但 powershell 的工作流程不起作用,因为它只是用于服务器,sript 也可以在普通计算机上以及从本地存储/可移动设备和其他位置执行

我还尝试创建一个附加密钥,强制 cmd 以管理员身份运行

答案1

我对您的问题的理解是,您的程序以普通用户身份运行,而您希望它以提升的身份运行。

您应该知道,UAC(用户帐户控制)可防止程序在未事先询问用户的情况下以提升的权限运行。

以下是一些让您的程序以高级用户身份运行的方法:

  • 使用位于 HKLM 而不是 HKCU 中的 RunOnce 键:它应该在计算机启动时启动该程序,并使用不受 UAC 限制的提升帐户。
  • 使用“管理员”登录应以提升权限运行脚本。默认管理员帐户不受 UAC 限制
  • 创建一个服务或提升的计划任务,并让你的 RunOnce 命令运行此任务或服务。
  • 在计算机上禁用 UAC(出于安全目的不建议

答案2

我无法让这个工作运行一次或者运行一次
但是,计划任务对我来说是有用的。

工作原理:
PowerShell进程-->开始进程cmdlet 与运行方式动词 --> 要运行的最终脚本

在下面的示例中,您可以:

  • 更换$PS命令路径变量(使脚本再次运行)以及脚本的路径
  • 更换登录时触发参数启动时
  • 设置-WindowsStyle参数值最小化或者最大化

此外,一旦您对所获得的内容感到满意,您可以:

  • 更换用户身份主要“NT 权限\系统”
  • 设置登录类型参数为服务账户使其作为隐藏的后台进程运行

$GlobalParameters = @{}
$GlobalParameters.Add('TaskPath', '\')
$GlobalParameters.Add('TaskName', 'MyTask')
$GlobalParameters.Add('Description', 'MyTask description')

#region Action
$PowerShell = 'C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe'
$ArgumentList = '-ExecutionPolicy Unrestricted -NoExit -File {0}' -f $PSCommandPath
$Command = "& Start-Process -FilePath '{0}' -WindowStyle Normal -Wait -Verb RunAs -ArgumentList '{1}'" -f $PowerShell, $ArgumentList
$CommandLine = '-NoExit -WindowStyle Normal -Command "{0}"' -f $Command

$Parameters = @{
    Execute  = $PowerShell
    Argument = $CommandLine
}
$ScheduledTaskAction = New-ScheduledTaskAction @Parameters
$GlobalParameters.Add('Action', $ScheduledTaskAction)
#endregion Action

#region Trigger
$Parameters = @{AtLogOn = $true }
$ScheduledTaskTrigger = New-ScheduledTaskTrigger @Parameters
$GlobalParameters.Add('Trigger', $ScheduledTaskTrigger)
#endregion Trigger

#region Principal
$Parameters = @{
    UserId    = $env:USERNAME
    LogonType = 'Interactive'
    RunLevel  = 'Highest'
}
$ScheduledTaskPrincipal = New-ScheduledTaskPrincipal @Parameters
$GlobalParameters.Add('Principal', $ScheduledTaskPrincipal)
#endregion Principal

Register-ScheduledTask @GlobalParameters

相关内容