为何System.Management.Automation WPF可执行部分PowerShell脚本却无法移除UWP应用?
问题描述
我开发了一款WPF应用(代码如下),通过System.Management.Automation调用PowerShell脚本。执行Start-Process notepad命令可正常启动记事本,但执行Get-AppxPackage {appName} | Remove-AppxPackage命令却无法移除指定UWP应用,且已在应用清单中配置管理员权限,请问这是为什么?
namespace powershell_execution { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } // function to create and execute an application to remove Microsoft.Calculator UWP app public void executeRemoval(object sender, RoutedEventArgs ex) { string appName = tbInput.Text.ToString(); string command = $"Get-AppxPackage {appName} | Remove-AppxPackage"; PowerShell.Create().AddScript(command).Invoke(); // this command does not remove anything. I have admin access in my app manifest. "Start-Process notepad" as a command works fine. tbOutput.Text = command; } } }
问题原因及解决办法
- 权限范围不匹配:即使WPF应用以管理员身份运行,
Remove-AppxPackage默认仅移除当前用户的UWP应用。若要移除所有用户的应用,需添加-AllUsers参数,命令改为:Get-AppxPackage -AllUsers {appName} | Remove-AppxPackage -AllUsers。 - 未捕获执行错误:原代码未处理PowerShell执行时的错误,无法定位命令失败的具体原因。通过捕获错误流能获取详细信息,辅助排查问题。
- PowerShell上下文限制:直接创建的PowerShell实例可能未完全继承应用的管理员权限上下文,同时部分系统预装UWP应用(如计算器)需要额外参数才能移除,可尝试添加
-PackageTypeFilter Bundle参数,命令改为:Get-AppxPackage -AllUsers -PackageTypeFilter Bundle {appName} | Remove-AppxPackage -AllUsers。
修改后的示例代码:
public void executeRemoval(object sender, RoutedEventArgs ex) { string appName = tbInput.Text.ToString(); string command = $"Get-AppxPackage -AllUsers {appName} | Remove-AppxPackage -AllUsers"; using (var ps = PowerShell.Create()) { ps.AddScript(command); var results = ps.Invoke(); // 捕获并显示错误信息 if (ps.HadErrors) { var errors = ps.Streams.Error.Select(e => e.Exception.Message); tbOutput.Text = string.Join(Environment.NewLine, errors); } else { tbOutput.Text = "若匹配到目标应用,已尝试完成移除操作"; } } }
内容的提问来源于stack exchange,提问作者Jake Stack
相关产品推荐
相关产品推荐

