如何以安装WSL的其他用户身份执行函数并捕获输出赋值给变量
实现方案
你可以通过PowerShell自带的凭据执行能力直接捕获输出,无需使用独立进程的runas命令,以下是两种可用方案:
方案1:临时交互执行(推荐)
- 先获取目标用户的凭据对象,执行时会弹出密码输入弹窗:
# 替换为实际的目标用户名 $targetCred = Get-Credential 目标用户名
- 直接通过带凭据的作业执行函数,捕获返回结果:
$wslIp = Start-Job -Credential $targetCred -ScriptBlock { function Get-WSLIP { wsl -- ip -o -4 -json addr list eth0 ` | ConvertFrom-Json ` | %{ $_.addr_info.local } ` | ?{ $_ } } return Get-WSLIP } | Wait-Job | Receive-Job # 执行完成后$wslIp变量就是目标用户身份查询到的WSL IP地址
该方案无需提前配置WinRM服务,本地直接可用。
方案2:非交互自动化执行
如果需要脚本自动执行不需要手动输入密码,可以提前将加密后的凭据存在本地(仅当前Windows用户可解密,安全度高):
- 首次执行时保存凭据到本地:
Get-Credential 目标用户名 | Export-Clixml -Path "$env:APPDATA\wsl_target_cred.xml"
- 后续脚本直接读取凭据执行即可:
$targetCred = Import-Clixml -Path "$env:APPDATA\wsl_target_cred.xml" $wslIp = Invoke-Command -Credential $targetCred -ScriptBlock { wsl -- ip -o -4 -json addr list eth0 | ConvertFrom-Json | %{ $_.addr_info.local } | ?{ $_ } }
注意事项
- 请确保目标用户已经完成WSL初始化,且执行查询时WSL实例处于运行状态,否则返回结果为空
- 如果目标用户的WSL实例默认网卡不是
eth0,请将脚本中的网卡名替换为实际使用的网卡名
内容的提问来源于stack exchange,提问作者dza
相关产品推荐
相关产品推荐

