C#调用PowerShell的Get-AppxPackage无法填充DataTable问题求助
问题原因及解决方案
Get-AppxPackage返回空集合的核心原因通常是权限不足或平台编译目标不匹配,以下是具体分析和修复方案:
1. 管理员权限要求
Get-AppxPackage -AllUsers 需要管理员权限才能访问所有用户的UWP应用信息。普通权限下,该命令仅能获取当前用户的UWP应用,若当前用户无UWP应用或权限受限无法读取,就会返回空集合。
修复:
在项目属性中配置管理员权限:右键项目 → 属性 → 安全性 → 勾选“启用ClickOnce安全设置”,打开app.manifest文件,将requestedExecutionLevel节点修改为:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
2. 平台编译目标不匹配
若WinForms项目编译目标为x86,在x64系统上运行时会调用32位PowerShell进程。32位PowerShell无法读取64位系统中UWP应用的注册信息,导致Get-AppxPackage返回空。
修复:
将项目编译目标改为Any CPU或x64:右键项目 → 属性 → 生成 → 平台目标,选择Any CPU(取消勾选“首选32位”)或x64。
3. 添加错误捕获逻辑
原代码未处理PowerShell的错误输出,无法定位命令执行失败的具体原因。建议添加错误捕获辅助排查:
修改后的GetPrograms_2代码:
private DataTable GetPrograms_2() { DataTable programTable_2 = new DataTable(); programTable_2.Columns.Add("App Name"); programTable_2.Columns.Add("App Version"); string command = "Get-AppxPackage -AllUsers | Select-Object Name, Version"; using (PowerShell powerShell = PowerShell.Create()) { powerShell.AddScript(command); Collection<PSObject> psObjects = powerShell.Invoke(); // 检查并输出PowerShell执行错误 if (powerShell.Streams.Error.Count > 0) { foreach (var error in powerShell.Streams.Error) { MessageBox.Show($"PowerShell执行错误: {error.Exception.Message}"); } } foreach (PSObject psObject in psObjects) { if (psObject.Properties["Name"]?.Value != null && psObject.Properties["Version"]?.Value != null) { string appName = psObject.Properties["Name"]?.Value?.ToString(); string appVersion = psObject.Properties["Version"]?.Value?.ToString(); programTable_2.Rows.Add(appName, appVersion); } } } return programTable_2; }
额外验证步骤
手动打开对应位数的PowerShell(以管理员身份),执行Get-AppxPackage -AllUsers | Select-Object Name, Version,确认是否能返回结果。若手动执行也无输出,需排查系统本身的UWP应用注册状态。
内容的提问来源于stack exchange,提问作者Joon Joon
相关产品推荐
相关产品推荐

