如何使用通用 Windows 平台 (UWP) 应用程序执行进程命令(或类似命令)?

Posted

技术标签:

【中文标题】如何使用通用 Windows 平台 (UWP) 应用程序执行进程命令(或类似命令)?【英文标题】:How to execute Process commands (or similar) using a Universal Windows Platform (UWP) App? 【发布时间】:2016-02-28 17:59:57 【问题描述】:

我正在创建自定义 Cortana 命令。使用通用 Windows 平台应用程序注册和执行命令。 (GitHub)

例如,我注册了以下命令

<Command Name="ShutDown">      
  <ListenFor>Shut down</ListenFor>
  <Navigate/>    
</Command>

在 UWP 应用程序中运行此功能

static async void ShutDown()

    var dialog = new MessageDialog("This is where I would shut the computer down.");
    await dialog.ShowAsync();
    //System.Diagnostics.Process.Start("Shutdown", "-s -t 10");

但是在设置之后,我了解到 UWP 不支持 System.Diagnostics.Process

我要运行的自定义命令涉及某种执行,例如启动外部程序、运行其他脚本或打开网站。

UWP 不支持它们是有道理的,因为它是通用的,而 XBox 或手机可能无法做到这些,但我希望在 Windows 10 PC 上有一些替代或黑客方法来实现这一点.

有没有办法让我在 UWP 应用程序中执行 Process 命令或其他具有类似功能的东西?似乎即使我可以让 Cortana 执行我的 C# 代码,UWP 也不支持在这种情况下有用的东西。

提前致谢。

【问题讨论】:

UWP 是否支持使用 WMI 如果支持,则使用 WMI 进行 @MethodMan 感谢您的想法,值得一试。不幸的是it doesn't look that WMI is supported either。这就是我的意思,我认为注册和执行命令将是困难的部分,我没有意识到 C# 在UWP 中会受到如此限制。 无赖。微软想要更多的应用程序,但他们把我们的手绑得更紧了。我想向“受信任”的应用程序进程发送命令 - 有什么大不了的?中间人攻击?开发者可以从应用向服务器发送和接收 json,为什么不能从应用到应用呢? 【参考方案1】:

在 Windows 10 周年更新 (1607) 中,可以选择在 PC 上启用此方案。使用 Desktop Extension SDK 中的这个 API,您可以启动以完全用户权限运行的完全信任进程:

https://docs.microsoft.com/en-us/uwp/api/Windows.ApplicationModel.FullTrustProcessLauncher

这样您就可以在支持它的平台上点亮它,即运行 1607 或更高版本的 PC。而且您的应用仍然是通用的:

if (ApiInformation.IsApiContractPresent("Windows.ApplicationModel.FullTrustAppContract", 1, 0))

    await FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync();

【讨论】:

但是,如果我使用它,我仍然可以在商店中发布我的应用吗? 是的,一般情况下可以。您必须完成桌面应用程序发布流程,其中包括对您的应用程序的入职审查,因为它具有完全信任功能。你可以从这里开始这个过程:developer.microsoft.com/en-us/windows/projects/campaigns/…【参考方案2】:

实现类似行为的方法有限。

    您可以使用 LaunchUri 来触发注册了某个 URI-Scheme 的其他应用程序。这应该适用于您的网络浏览器方案。更多细节在这里: https://msdn.microsoft.com/en-us/library/windows/apps/windows.system.launcher.launchuriasync.aspx

    您可以使用 LaunchForResults 触发另一个应用程序并从中获取结果。被调用的应用程序必须支持这一点。更多细节在这里: https://msdn.microsoft.com/en-us/library/windows/apps/mt269386.aspx

    您可以触发其他应用提供的应用服务。被调用的应用程序必须支持这一点。应用服务将在后台执行。 (我觉得这很酷。)更多细节在这里:http://blogs.msdn.com/b/mvpawardprogram/archive/2015/06/11/writing-windows-10-app-services-in-javascript.aspx

    这有点奇怪:我不确定这是否仍然有效,但它确实适用于 Windows 8.1:您可以创建一个所谓的“代理组件”。这允许您从您的计算机上的应用程序触发所有内容,但您将无法将代理组件发布到商店中。这也允许在 Windows 8.1 上使用 Process.Start()。它仅适用于侧载应用程序。我不确定它是否仍然适用于 Windows 10。 更多信息在这里:https://msdn.microsoft.com/en-us/library/windows/apps/dn630195.aspx

总结: 只要目标应用程序注册为应用程序服务或注册协议处理程序(Uri 方案),启动另一个应用程序就非常容易。 如果选项 4 不再起作用,则无法启动脚本或其他 *.exe。

【讨论】:

感谢您的回复!今晚我会尝试其中一些。 有没有人尝试使用 AppService 来“关闭”或“重启”平板电脑?我似乎找不到办法。 该文档说选项 4 在 Windows 10 中仍然可用,但它不能发布到一般消费者 Windows 应用商店。 docs.microsoft.com/en-us/windows/uwp/winrt-components/…

以上是关于如何使用通用 Windows 平台 (UWP) 应用程序执行进程命令(或类似命令)?的主要内容,如果未能解决你的问题,请参考以下文章

通用Windows平台(UWP)中的加密/解密存在数据错误(循环冗余校验)

详解 UWP (通用 Windows 平台) 中的两种 HttpClient API

如何为通用 Windows 平台(UWP)应用程序创建 .appx 包?

通用 Windows 平台上的 Type.GetTypeCode

什么是UWP应用?

Windows 编程入门,了解什么是UWP应用。