我能否在 Windows runner 上为 GitHub action 步骤指定用户帐户?

6

我正在使用GitHub行动步骤在Windows runner上工作。 我尝试运行的可执行文件要求不能作为管理员运行。

是否有任何方法可以创建并成为与Windows runner上默认管理员帐户不同的用户?

2个回答

6

在 VonC 的回答中提供的链接的启发下,我在过去几天里进入了一些兔子洞。 简而言之:

  • 使用 runas(包括 Powershell Start-Process)的选项无效,我相信不能工作。
  • 使用 paexec 选项,它是 SysInternals psexec 的开源版本,有效地完成了以另一个用户的登录身份执行程序的任务。 程序本身需要输出到日志文件以便稍后阅读,因为没有从 paexec 命令本身接收到任何程序输出。 可能 psexec 也可以工作;查看两者的 EULA/license 来决定您喜欢哪一个。

此答案未检查退出代码,需要在失败时读取输出文件。VonC 的答案给出了该过程的一些替代方案。

以下是使用 PAExec 在我的项目上运行 "mvnw test" 的 GHA 步骤:

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

我猜也许使用psexec(不带-lo开关,但有一个-accepteula开关)也可以实现这个目标。
早期的回答保留了调查步骤:
我相信这是有可能的,但很难。如果不需要stdout/stderr的输出,则可以降低权限并执行命令,但在我的用例(CI测试)中,我需要该输出。
引用的 Start-Process -Verb Runas 'yourUser' -Wait 是一个有趣的开始,需要进一步深入研究。GitHub Actions在Windows运行程序上实际上在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 会导致错误消息:

无法使用指定的命名参数解析参数集。一个或多个电子邮件地址不能同时使用,或者提供的参数数量不足。

我一直没有能够同时结合该动词和输出打印。 这个问题的答案概述了各种其他选项,但我未能成功应用它们。看起来在UAC禁用的情况下,未将其分配给另一个用户就降级是行不通的。

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

我能够通过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 $pwd\mvnTest.bat

我认为我可以使用较低的权限进行执行(并且可以轻松地以其他用户身份运行),但只有在不访问程序输出时才能这样做。

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

2
反馈很好,细节描述得很清楚。已点赞。 - VonC

1
目前似乎不支持该功能。
正如这篇讨论(2022年10月)所示:

This is an issue we are facing on the windows-latest runner where all commands are run as admin.

It seems like the correct approach to use would be:

net user "username" "<password>" /add
runas /user:username ".\bin\program.bat"

But runas is designed to prompt for password input and there is no way to supply a password. passwordless is also unsupported.

您可以尝试以下 "在Windows中使用不同用户身份而无需密码从提升的提示符运行" 中提出的方法之一,例如:
Start-Process -Verb Runas 'yourUser' -Wait

Daniel Widdis答案中可以实现此功能,但不会提供退出状态。
为此,我将确保执行的命令(mvnw.cmd)是一个包装器,其中:
  • 执行您想要的内容
  • 获取退出状态
  • 在单独的文件中写入退出状态
您可以使用action/core设置操作的退出代码
或者检查先前步骤的结果,并在单独的步骤中设置最终退出状态。

搞定了!看看我的答案;你有机会通过完成带有退出代码处理的解决方案来赚取奖励。 - Daniel Widdis
@DanielWiddis 当然可以。我没有机会/时间实际测试它,但我已经编辑了答案并提供了一些想法。 - VonC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接