我可以为 Windows 运行程序上的 GitHub 操作步骤指定用户帐户吗?

Ale*_*zzi 6 windows psexec runas github-api github-actions

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

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

Dan*_*dis 7

受到 VonC答案中的链接的启发,我在过去的几天里陷入了一些兔子洞。总而言之:

  • 使用 runas 的选项(包括 Powershell Start-Process)不起作用,而且我确信也不起作用。
  • paexec使用SysInternals 的开源版本的选项psexec可以有效地完成在另一个用户登录下执行程序的任务。程序本身需要输出到日志以供稍后读取,因为没有从paexec命令本身接收到程序输出。它可能psexec也会起作用;查看两者的 EULA/许可证来决定您更喜欢哪一个。

此答案不检查退出代码,失败时需要退出代码来读取输出文件。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
Run Code Online (Sandbox Code Playgroud)

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


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

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

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

  • Runas实际上提升了一个过程,相应的RunasUser降低了标高,本次练习的目标
  • 我以为我可以使用它,但是该命令将所有输出吞没到 stderr/stdout,后来的研究表明,当以禁用 UAC 的RunasUser管理员身份运行时,权限限制根本不适用,因此以其他用户身份运行基本上是唯一的方法选项。
    • 我尝试了各种解决方法来尝试提取输出,但没有成功。
    • 我得到的最接近的是这个,它提供了输出:
$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
Run Code Online (Sandbox Code Playgroud)

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

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

我无法同时将该动词和输出打印结合起来。 这个问题的答案概述了我未能成功应用的各种其他选项。似乎在禁用 UAC 的情况下,在不分配给其他用户的情况下进行降级是行不通的。

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

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

$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
Run Code Online (Sandbox Code Playgroud)

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

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

  • 反馈很好,很详细。已投赞成票。 (2认同)

Von*_*onC 1

目前似乎不支持这一点。

正如本次讨论(2022 年 10 月)所示

这是我们在运行器上面临的一个问题windows-latest,其中所有命令都运行为admin.

正确的使用方法似乎是:

net user "username" "<password>" /add
runas /user:username ".\bin\program.bat"
Run Code Online (Sandbox Code Playgroud)

runas旨在提示输入密码,并且无法提供密码。也不支持无密码。

您可以尝试“在 Windows 中以不同用户身份运行且无需密码的提升提示符”中提出的方法之一,例如:

Start-Process -Verb Runas 'yourUser' -Wait
Run Code Online (Sandbox Code Playgroud)

来自Daniel Widdis回答来看,这可以工作,但不会提供退出状态。

为此,我要确保执行的命令 ( mvnw.cmd) 是一个包装器,其中:

  • 执行你想要的
  • 获取退出状态
  • 将退出状态写入单独的文件中

您可以使用action/core为您的操作设置退出代码
或者检查上一步的结果,并在单独的步骤中设置最终退出状态。