【问题标题】:Elevated PS script in JenkinsJenkins 中提升的 PS 脚本
【发布时间】:2016-12-08 15:49:52
【问题描述】:

我一直在尝试从 Windows Jenkins(从)服务器运行脚本。该脚本是用 PowerShell 编写的,需要提升权限(例如,如果右键单击 PS 并选择以管理员身份运行)。

Jenkins 通过以下方式启动其脚本:

powershell.exe -NonInteractive -ExecutionPolicy ByPass "& 'C:\Users\JOHAN.DER\AppData\Local\Temp\2\hudson9084956499652818911.ps1'" 

我的脚本失败,因为它需要提升的权限。如何生成一个可以运行我的脚本的新的提升特权的 PS 进程(不需要单击,因为 Jenkins 不能这样做)?

干杯!

【问题讨论】:

  • 免责声明 - 我从未真正使用过 Jenkins,我假设它与其他类似产品的工作方式相似。因此,除此之外,我认为 Jenkins 使用其工作帐户所具有的任何特权运行脚本,因此,如果您在从属服务器上的管理上下文下运行,则特权将被“提升”。请注意,仅在图形会话中需要执行 RunAs 管理员,基于服务的会话始终可以访问它们正在运行的帐户上下文的最高权限级别。

标签: powershell jenkins


【解决方案1】:

下面的 sn-p 检查当前进程是否被提升,如果没有,它会生成一个新的特权进程。获取子 powershell 进程的输出有点棘手,所以我使用脚本命令来捕获它。您可以在下面找到我的管道定义步骤:

            powershell """
                cd "${env.WORKSPACE}"
                If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
                { 
                    echo "* Respawning PowerShell child process with elevated privileges"
                    \$pinfo = New-Object System.Diagnostics.ProcessStartInfo
                    \$pinfo.FileName = "powershell"
                    \$pinfo.Arguments = "& '" + \$myinvocation.mycommand.definition + "'"
                    \$pinfo.Verb = "RunAs"
                    \$pinfo.RedirectStandardError = \$false
                    \$pinfo.RedirectStandardOutput = \$false
                    \$pinfo.UseShellExecute = \$true
                    \$p = New-Object System.Diagnostics.Process
                    \$p.StartInfo = \$pinfo
                    \$p.Start() | Out-Null
                    \$p.WaitForExit()
                    echo "* Child process finished"
                    type "C:/jenkins/transcript-${env.JOB_NAME}-${env.BUILD_NUMBER}.txt"
                    Remove-Item "C:/jenkins/transcript-${env.JOB_NAME}-${env.BUILD_NUMBER}.txt"
                    Exit \$p.ExitCode
                } Else {
                    echo "Child process starting with admin privileges"
                    Start-Transcript -Path "C:/jenkins/transcript-${env.JOB_NAME}-${env.BUILD_NUMBER}.txt"
                }

                # put rest of your script here, it will get executed
                # with elevated privileges.
            """

【讨论】:

  • 非常好!尽管它确实在代理上打开了一个 PowerShell 窗口 - 我是否错过了一些不会在代理上显示任何内容的内容?
  • 您可以尝试将 pinfo 的“WindowStyle”属性设置为“隐藏”
【解决方案2】:

试试这个:

powershell -Command "Start-Process powershell \"-ExecutionPolicy Bypass -NoExit -Command `\"cd \`\"%scriptFolderPath%`\"; & \`\".\%powershellScriptFileName%\`\"`\"\" -Verb RunAs"

【讨论】:

  • 你能解释一下语法吗?我对反引号(`)和所有反斜杠转义感到有些困惑。我将如何为 powershell '& "C:\\Program Files\\VisBuildPro9\\VisBuildCmd.exe" "mybuildfile.bld" ' 之类的命令执行此操作
  • 调用PS然后告诉ps运行一个进程,然后绕过主机的执行策略,然后运行命令更改目录并转到脚本所在的路径,然后调用脚本文件并在以提升模式结束运行(作为管理员)
【解决方案3】:

即使这是一个旧线程,我仍然在这里提供我的方法,因为我遇到了同样的问题,希望能帮助任何正在寻找答案的人。

首先,这个问题与Jenkins无关,是Windows的问题,你必须启用内置管理员才能获得提升的权限,这里是reference:

管理员用户
这是一个未提升的管理员帐户 在安装 Windows 期间默认创建。如果 管理员用户尝试执行需要提升权限的操作 (例如:以管理员身份运行),Windows 将显示 UAC 提示符 管理员用户在允许操作之前批准。

内置“管理员”
隐藏的内置提升 “管理员帐户”是一个本地帐户,拥有完整的 对 PC 的无限制访问权限。默认情况下,此“管理员” UAC 不会提示帐号。

启用内置管理员后,您有两种方式来提升由 Jenkins 触发的 PS 脚本:

1.使用内置管理员登录Windows:
这是实现目标的最简单方法,只需使用内置管理员登录,一切都得到提升,包括 Jenkins 触发的 PS 脚本。 (我正在使用这种方法。)

2.通过凭据并以管理员身份运行:
在你的 PS 脚本中添加一些代码

$user = "Administrator"
$passwd = "password"
$securePasswd = ConvertTo-SecureString $passwd -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential $user, $securePasswd

#Use Credential to prevent from being prompted for password
#Use argument -Verb RunAs to get script elevated
Start-Process powershell.exe -Credential $credential -ArgumentList "Start-Process powershell.exe -Verb RunAs -ArgumentList '-File  hudson.ps1' -Wait" 

【讨论】:

  • 我喜欢这个想法,但是你如何让它在需要每两个月更改一次密码的系统上工作(这是我的情况0?
  • 我猜你想在PS脚本中“自动”更改密码,所以也许你可以尝试为密码定义一个“规则”,例如本月的密码是“202003” ”,那么下个月就是“202004”,这样你就可以在PS脚本中写一些代码来匹配密码,只是我的粗略想法,我没有测试,这会带来一些安全风险。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
相关资源
最近更新 更多