【问题标题】:Can I specify a user account for a GitHub action step on a Windows runner?我可以为 Windows 运行器上的 GitHub 操作步骤指定用户帐户吗?
【发布时间】:2022-11-03 15:41:22
【问题描述】:

我正在 Windows 运行器上使用 GitHub 操作步骤。我尝试运行的可执行文件的要求之一是它不能以管理员身份运行。

有什么方法可以创建并成为 Windows 运行器上操作使用的默认管理员帐户的不同用户?

【问题讨论】:

    标签: windows github-actions github-api psexec runas


    【解决方案1】:

    可以办到!

    受 VonC 的answer 链接的启发,在过去的几天里,我经历了几个兔子洞。 TLDR:

    • 使用 runas 的选项(包括 Powershell Start-Process)不工作,我确信不能工作
    • 使用paexec的选项,SysInternalspsexec的开源版本,有效地完成了执行程序的任务。程序本身需要输出到日志以供稍后读取。

    此答案尚未检查退出代码。这个问题还有赏金我将奖励给通过适当处理(并返回 GHA 工作流程)失败退出代码来改进我的答案的人日志输出后.

    这是使用 PAExec 在我的项目上运行“mvnw test”的工作 GHA 步骤:

    - name: Download PaExec
      run: |
        choco install wget --no-progress 
        wget -q https://www.poweradmin.com/paexec/paexec.exe -P C:WindowsSystem32
    - name: Create new user
      run: |
        net user foo p@ssw0rd /add
    - name: Test with Maven
      run: |
        paexec -u foo -p p@ssw0rd -lo $pwdoutput.txt -w $pwd $pwdmvnw.cmd test -l $pwdmvntest.txt 
        cat output.txt
        cat mvntest.txt
    

    我怀疑它也可以与 psexec 一起使用(没有-lo 开关)。


    保留调查步骤的较早答案:

    我相信这样的事情是可能的,但难以捉摸。我已经确定,如果不需要来自 stdout/stderr 的输出,则可以降低权限并执行命令,但在我的用例(CI 测试)中,我需要该输出。

    引用的Start-Process -Verb Runas 'yourUser' -Wait 是长期调查的一个有趣的开始。 Windows 运行器上的 GitHub Actions 实际上是在 PowerShell 环境中执行的,因此可以直接调用它。但是,一些注意事项:

    • Runas实际上提升了一个进程,对应的RunasUser降低了提升,本练习的目标
    • 我以为我可以使用RunasUser,但该命令会将所有输出吞没到 stderr/stdout,后来的研究表明,当以管理员身份运行时禁用 UAC,权限限制根本不适用,因此以另一个用户身份运行基本上是唯一的选择。
      • 我尝试了各种解决方法来尝试提取输出,但均未成功。
      • 我得到的最接近的是这个,它提供输出:
    $process = Start-Process -FilePath mvnw.cmd -ArgumentList "clean test -B" -Wait -RedirectStandardOutput stdout.txt -RedirectStandardError stderr.txt
    cat stderr.txt
    cat stdout.txt
    $process.ExitCode
    

    但是,添加 -Verb RunasUser 会导致错误消息:

    无法使用指定的命名参数解析参数集。发出的一个或多个参数不能一起使用或提供的参数数量不足。

    我无法同时将该动词和输出打印结合起来。 Answers to this question 概述了我未能成功申请的各种其他选项。似乎在禁用 UAC 的情况下,在不分配给其他用户的情况下进行降级。

    VonC 的答案中链接的另一个选项建议使用psexec from the Windows Sysinternals。这也让我非常接近解决方案,但由于缺乏输出而失败了。 (请注意,我后来发现我可以在内部输出并稍后收集日志。)

    我能够通过 github 操作下载并安装 psexec 并尝试使用它,如下所示:

    - name: Download Sysinternals PsTools
      run: |
        choco install -y --no-progress sysinternals
    - name: Create batch file to wrap execution
      run: |
        echo "cd $pwd" > mvnTest.bat
        echo "mvnw.cmd clean test -B >CON:" >> mvnTest.bat
    - name: Test with Maven
      run: |
        PsExec64 -accepteula -l $pwdmvnTest.bat
    

    我认为我能够以较低的权限执行(并且可以轻松地作为另一个用户执行),但只能在不访问程序输出的情况下执行。

    • 该程序似乎旨在在另一台服务器上远程执行命令
    • 可以在本地执行而不输出
    • 可以通过localhost或者127.0.0.1执行得到输出;但是,这限制了您只能使用内置命令,并且不适用于批处理文件

    【讨论】:

    • 反馈很好,很详细。赞成。
    【解决方案2】:

    目前似乎不支持。

    就像这个discussion (Oct. 2022) illustrates

    这是我们在windows-latest runner 上面临的一个问题,所有命令都以admin 运行。

    似乎正确的使用方法是:

    net user "username" "<password>" /add
    runas /user:username ".inprogram.bat"
    

    runas 设计用于提示输入密码,无法提供密码。无密码也不支持。

    您可以尝试“Run as a different user without a password from an elevated prompt in Windows”中提出的一种方法,例如:

    Start-Process -Verb Runas 'yourUser' -Wait
    

    【讨论】:

    • 是的,我在您的第一个链接中是colleagues with those asking the question,但是,您的第二个链接中的提示(我已经看过)表明也许有一种解决方法,我希望这里有人可以帮助识别。
    • 弄清楚了!看我的回答;通过完成退出代码处理的解决方案,您有机会获得赏金。
    最近更新 更多