【发布时间】:2022-11-03 15:41:22
【问题描述】:
我正在 Windows 运行器上使用 GitHub 操作步骤。我尝试运行的可执行文件的要求之一是它不能以管理员身份运行。
有什么方法可以创建并成为 Windows 运行器上操作使用的默认管理员帐户的不同用户?
【问题讨论】:
标签: windows github-actions github-api psexec runas
我正在 Windows 运行器上使用 GitHub 操作步骤。我尝试运行的可执行文件的要求之一是它不能以管理员身份运行。
有什么方法可以创建并成为 Windows 运行器上操作使用的默认管理员帐户的不同用户?
【问题讨论】:
标签: windows github-actions github-api psexec runas
可以办到!
受 VonC 的answer 链接的启发,在过去的几天里,我经历了几个兔子洞。 TLDR:
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 的答案中链接的另一个选项建议使用
psexecfrom 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执行得到输出;但是,这限制了您只能使用内置命令,并且不适用于批处理文件
【讨论】:
目前似乎不支持。
就像这个discussion (Oct. 2022) illustrates:
这是我们在
windows-latestrunner 上面临的一个问题,所有命令都以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
【讨论】: