使用 PowerShell for Windows IoT
注意
使用 Import-PSCoreRelease 添加开源 PowerShell 版本。 仍然需要 IOT_POWERSHELL 功能才能包含 WinRM 二进制文件
通过使用 Windows PowerShell 远程配置和管理任何 Windows 10 IoT 核心版设备。 PowerShell 是基于任务的命令行 Shell 和脚本语言,专为进行系统管理而设计。
请务必遵循以下步骤正确配置运行 Windows 10 IoT 核心版的设备,以便正常使用 VisualStudio 2017。
启动 PowerShell 会话
若要使用 Windows 10 IoT 核心版设备启动 PowerShell 会话,首先需要在主机电脑与设备之间创建信任关系。 在启动 Windows IoT 核心版设备后,与该设备相连的屏幕上将显示一个 IP 地址。
可在 Windows 10 IoT 核心版仪表板中找到相同信息。
在本地电脑上打开管理员 PowerShell 控制台。 在 Windows“开始”菜单旁的“搜索 Web 和 Windows”框中键入“powershell”。 Windows 将在你的电脑上查找 PowerShell。
若要以管理员身份启动 PowerShell,请右键单击“Windows PowerShell”,然后选择“以管理员身份运行”。
现在,应该会看到 PowerShell 控制台。
可能需要在桌面上启动 WinRM 服务才能启用远程连接。 为此,请在 PowerShell 控制台中键入以下命令:
net start WinRM
在 PowerShell 控制台中,键入以下内容,用适当的值替换
<machine-name or IP address>
(使用 计算机名称 最简单,但如果设备在网络上没有唯一名称,请尝试) IP 地址:Set-Item WSMan:\localhost\Client\TrustedHosts -Value <machine-name or IP Address>
输入
Y
以确认更改。Set-Item WSMan:\localhost\Client\TrustedHosts -Value "<machine1-name or IP Address>,<machine2-name or IP Address>"
注意
如果你想要连接多台设备,可使用逗号和引号分隔每台设备。
现在,你可以使用你的 Windows IoT 核心版设备启动会话。 在管理员 PowerShell 控制台中,键入:
Enter-PSSession -ComputerName <machine-name or IP Address> -Credential <machine-name or IP Address or localhost>\Administrator
在凭据对话框中,输入以下默认密码:
p@ssw0rd
注意
连接过程不会立即完成,最多需要 30 秒。
如果已成功连接到设备,则应会在系统提示之前看到设备的 IP 地址。
更新帐户密码。 强烈建议更新管理员帐户的默认密码。 若要执行此操作,请在 PowerShell 连接中发出以下命令:
a. 使用强密码替换
[new password]
:net user Administrator [new password]
b. 接下来,使用
Exit-PSSession
和Enter-PSSession
与新凭据建立新的 PowerShell 会话。Exit-PSSession Enter-PSSession -ComputerName <machine-name or IP Address> -Credential <machine-name or IP Address or localhost>\Administrator
常用 PowerShell 命令
使用 Visual Studio 远程调试程序排除故障
为了能够从 Visual Studio 2017 部署应用程序,你将需要确保 Visual Studio 远程调试程序正在 Windows IoT 核心版设备上运行。 启动计算机时,远程调试程序应会自动打开。 若要再次检查,请使用 tlist
命令列出 PowerShell 中所有正在运行的进程。 应有两个 msvsmon.exe 的实例正在设备上运行。
在很长一段时间都处于非活动状态后,Visual Studio 远程调试器可能会超时。 如果 Visual Studio 无法连接到 Windows IoT 核心版设备,请尝试重启设备。
配置 Windows IoT 核心版设备
可根据需要重命名设备。
若要更改计算机名称,请使用
setcomputername
实用工具:setcomputername <new-name>
重启设备以使更改生效。 可以使用
shutdown
命令,如下所示:shutdown /r /t 0
计算机名称已更改,因此重启后,将需要重新运行此命令,使用新名称连接到设备:
Set-Item WSMan:\localhost\Client\TrustedHosts -Value <new-name>
你的 Windows IoT 核心版设备现在应该已正确配置且可供使用!
常用的实用工具
有关可与 PowerShell 结合使用的命令和实用工具的列表,请参阅命令行实用工具页面。
已知问题和解决方法
问题:PowerShell 安全策略中的一个已知 Bug 导致远程会话内的清单出现以下问题:
- Get-Help 返回异常匹配项。
- 指定模块上的 Get-Command 返回空命令列表。
- 从以下任意模块运行 cmdlet 将引发 CommandNotFoundException: Appx、NetAdapter、NetSecurity、NetTCPIP、PnpDevice。
- 上述任意模块上的 Import-Module 将引发 PSSecurityException 异常(包含 UnauthorizedAccess)。 模块自动加载似乎也不起作用。
解决方法:将远程 PowerShell 会话内的执行策略修改为 RemoteSigned。 若要详细了解不同的执行策略,请参阅使用 Set-ExecutionPolicy Cmdlet。
问题:某些模块中的 cmdlet(如 NetAdapter)有时不可见。 例如,Get-Module NetAdapter 将返回一个空列表。
解决方法:将 -Force 参数与 Import-Module 结合使用。 例如,Import-Module NetAdapter -Force
。
问题:将执行策略设置为“AllSigned”会中断 PowerShell 远程控制。 创建远程会话的后续尝试均失败,并且 SecurityException 正在加载 Typesv3.ps1xml。
解决方法:使用 winrs.exe 还原 PowerShell 执行策略:
- 更改控制台代码页
Chcp 65001
- 登录远程 cmd.exe shell
Winrs.exe -r:<target> -u:<username> -p:<password> cmd.exe
- 在远程 cmd.exe 内,修改相应的注册表项
reg add HKLM\Software\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell /v ExecutionPolicy /d RemoteSigned /f
- 退出远程 cmd.exe 会话
exit
其他已知问题
在 PowerShell 脚本中,PowerShell 类或枚举的属性不起作用。 添加属性化引发以下异常:类型必须为运行时类型对象。
不支持出站 CIM 和 PowerShell 远程控制。 依赖 cmdlet 的相关功能将不起作用。 其中包括:Enter-PSSession、Get-Job、Receive-Job、Import-Module、Invoke-Command 和 Copy-Item。
除非会话是使用 CredSSP 身份验证创建的,否则 SecureString 命令“ConvertFrom-SecureString”和“ConverTo-SecureString”不起作用。 否则,必须指定 -Key 参数。 若要详细了解如何配置 CredSSP 身份验证,请参阅使用 CredSSP 启用 PowerShell“第二个跃点”功能。