无需管理员权限在Hyper-V虚拟机中调用PowerShell 7命令
问题描述
在Windows 11主机上通过PowerShell远程操作Windows 10 Hyper-V虚拟机,需满足以下要求:
- 来宾OS中使用PowerShell 7执行命令
- 无需来宾OS管理员权限(
runas /trustlevel:0x20000 <cmd>无法满足需求) - 同步执行并捕获输出(计划任务、
explorer.exe <cmd>等降权方法不适用)
当前状态:
- PowerShell 5.1中,非管理员可正常通过
Invoke-Command/New-Session远程执行命令 - PowerShell 7中,管理员用户可正常调用会话配置,但非管理员执行报错:
OpenError: Cannot create or open the configuration session PowerShell.7.
已尝试无效操作:
- 将用户添加至"Remote Management Users"组
- 通过
Set-PSSessionConfiguration -Name PowerShell.7 -ShowSecurityDescriptorUI为会话配置添加用户/Users组权限 - 修改默认
Microsoft.PowerShell配置指向PowerShell 7(实际执行仍使用5.1)
排除方案:PowerShell over SSH(存在密钥、网络可达等问题,需更简便方案)
解决方案
1. 修复PowerShell 7会话配置的安全描述符
默认Enable-PSRemoting创建的PowerShell.7会话配置,非管理员缺少**Execute (Invoke)**权限,需通过命令行精确配置:
# 以管理员身份在来宾OS的PowerShell 7中执行 $configName = "PowerShell.7" $sd = Get-PSSessionConfiguration -Name $configName | Select-Object -ExpandProperty SecurityDescriptorSddl $newSd = ConvertFrom-SddlString -Sddl $sd # 添加本地Users组的Execute权限 $usersSid = New-Object System.Security.Principal.SecurityIdentifier([System.Security.Principal.WellKnownSidType]::BuiltinUsersSid, $null) $accessRule = New-Object System.Security.AccessControl.CommonAce( [System.Security.AccessControl.AceFlags]::None, [System.Security.AccessControl.AceQualifier]::AccessAllowed, 268435456, # 对应Execute (Invoke)权限掩码 $usersSid, $false, $null ) $newSd.DiscretionaryAcl.AddAce($accessRule) Set-PSSessionConfiguration -Name $configName -SecurityDescriptorSddl $newSd.GetSddlForm([System.Security.AccessControl.AccessControlSections]::All) -Force
2. 调整WinRM服务的非管理员会话限制
WinRM默认可能限制非管理员创建远程会话,需修改服务配置:
# 以管理员身份在来宾OS的PowerShell(5.1/7均可)中执行 # 按需设置受信任主机(示例为允许所有,可根据网络环境调整) Set-Item WSMan:\localhost\Client\TrustedHosts -Value "*" -Force # 保持加密传输,禁用明文 Set-Item WSMan:\localhost\Service\AllowUnencrypted -Value $false -Force # 启用协商认证 Set-Item WSMan:\localhost\Service\Auth\Negotiate -Value $true -Force # 允许非管理员远程访问 Set-Item WSMan:\localhost\Service\AllowRemoteAccess -Value $true -Force # 调整并发用户数(按需设置) Set-Item WSMan:\localhost\Service\Config\MaxConcurrentUsers -Value 10 -Force
3. 验证PowerShell 7安装目录权限
确保非管理员对PowerShell 7安装目录(默认C:\Program Files\PowerShell\7)有读取和执行权限:
- 右键目录 → 属性 → 安全选项卡
- 检查Users组是否包含“读取和执行”、“列出文件夹内容”、“读取”权限,缺失则添加
4. 测试远程执行
在Windows 11主机上,用非管理员PowerShell执行以下命令验证:
Invoke-Command -ComputerName <虚拟机IP/主机名> -ConfigurationName PowerShell.7 -ScriptBlock { $PSVersionTable.PSVersion }
成功执行后会返回PowerShell 7的版本信息,且输出同步捕获。
原因分析
PowerShell 7会话配置的默认安全描述符未给非管理员分配**Execute (Invoke)**核心权限,仅通过图形化界面添加常规权限无法解决问题;同时WinRM服务默认可能限制非管理员创建远程会话,需显式开启相关配置。
内容的提问来源于stack exchange,提问作者ibebbs
相关产品推荐
相关产品推荐

