Powershell Jenkins中的提升PS脚本

Powershell Jenkins中的提升PS脚本,powershell,jenkins,Powershell,Jenkins,我一直在尝试从Windows Jenkins(从)服务器运行脚本。该脚本是在PowerShell中编写的,需要提升的权限(例如在PS上单击鼠标右键并选择“以管理员身份运行”) Jenkins通过以下方式发布其脚本: powershell.exe -NonInteractive -ExecutionPolicy ByPass "& 'C:\Users\JOHAN.DER\AppData\Local\Temp\2\hudson9084956499652818911.ps1'" 我的脚本失

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

Jenkins通过以下方式发布其脚本:

powershell.exe -NonInteractive -ExecutionPolicy ByPass "& 'C:\Users\JOHAN.DER\AppData\Local\Temp\2\hudson9084956499652818911.ps1'" 
我的脚本失败,因为它需要提升的权限。如何生成一个可以运行我的脚本的新提升的特权PS进程(不需要单击,因为Jenkins不能这样做)

干杯

试试这个:

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

下面的代码段检查当前进程是否已提升,如果未提升,则生成一个新的特权进程。获取子powershell进程的输出有点棘手,所以我使用transcript命令捕获它。您可以在下面找到我的管道定义步骤:

            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.
            """

尽管这是一个古老的线索,我仍然在这里提供我的方法,因为我有同样的问题,希望能帮助任何人找到答案

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

管理员用户
它是一个不相关的管理员帐户 默认情况下在Windows安装过程中创建的。如果 管理员用户尝试执行需要提升权限的操作 (例如:以管理员身份运行),Windows将为 在允许操作之前,管理员用户要进行批准

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

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

1.使用内置管理员登录窗口:
这是实现目标的最简单方法,只需使用内置管理员登录,所有内容都会提升,包括Jenkins触发的PS脚本。(我正在使用此方法。)

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

$user=“管理员”
$passwd=“密码”
$securePasswd=converttosecurestring$passwd-AsPlainText-Force
$credential=新对象System.Management.Automation.PSCredential$user,$SecurePassword
#使用凭据防止提示输入密码
#使用参数-动词运行方式提升脚本
启动进程powershell.exe-凭证$Credential-ArgumentList“启动进程powershell.exe-动词RunAs-ArgumentList'-文件hudson.ps1'-等待”

免责声明-我从未实际使用过Jenkins,我假设它与其他类似产品的工作原理类似。因此,我认为Jenkins会以作业帐户拥有的任何权限运行脚本,因此如果您在从属服务器上的管理上下文下运行它,则权限将“提升”。请注意,只有在图形会话中才需要运行方式管理员,基于服务的会话始终可以访问其运行的帐户上下文的最高权限级别。您能解释一下语法吗?我有点被反斜杠(`)和所有反斜杠逃逸弄糊涂了。对于像powershell&“C:\\Program Files\\VisBuildPro9\\VisBuildCmd.exe”“mybuildfile.bld”这样的命令,我将如何执行此操作?调用ps,然后告诉ps运行进程,然后绕过主机的执行策略,然后运行更改目录的命令并转到脚本所在的路径,然后调用脚本文件,最后以提升模式运行(作为管理员)非常好!虽然它确实会在代理上显示PowerShell窗口-我在这篇文章中是否遗漏了一些不会在代理上显示任何内容的内容?您可以尝试将pinfo的“WindowStyle”属性设置为“Hidden”值。我喜欢这个主意,但如何让它在需要每两个月更改一次密码的系统上工作(这是我的情况0?我猜您希望在PS脚本中“自动”更改密码,因此您可以尝试为密码定义一个“规则”,例如,本月的密码为“202003”,下个月的密码为“202004”,以便您可以在PS脚本中编写一些代码来匹配密码,这只是我的粗略想法,我没有测试它,这将导致一些安全风险。