我正在使用GitHub行动步骤在Windows runner上工作。 我尝试运行的可执行文件要求不能作为管理员运行。
是否有任何方法可以创建并成为与Windows runner上默认管理员帐户不同的用户?
我正在使用GitHub行动步骤在Windows runner上工作。 我尝试运行的可执行文件要求不能作为管理员运行。
是否有任何方法可以创建并成为与Windows runner上默认管理员帐户不同的用户?
在 VonC 的回答中提供的链接的启发下,我在过去几天里进入了一些兔子洞。 简而言之:
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
-lo
开关,但有一个-accepteula
开关)也可以实现这个目标。
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 执行可以获得输出;然而,这限制了您只能使用内置命令,并且不适用于批文件
您可以尝试以下 "在Windows中使用不同用户身份而无需密码从提升的提示符运行" 中提出的方法之一,例如:This is an issue we are facing on the
windows-latest
runner where all commands are run asadmin
.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.
Start-Process -Verb Runas 'yourUser' -Wait
mvnw.cmd
)是一个包装器,其中: