如何使用FulltrustProcessLauncher执行Powershell命令

时间:2018-06-25 19:28:59

标签: c# powershell uwp

我试图在UWP应用中使用Powershell启动一个简单的命令。我碰到一堵砖墙,并已完成以下操作:

在我的包裹清单文件中,我放置了以下内容:

<Extensions>
    <desktop:Extension Category="windows.fullTrustProcess" Executable="powershell.exe">

然后我创建了一个组ID:

<desktop:ParameterGroup GroupId="RestartPC" Parameters="Restart-Computer"/>

在我的MainPage.xaml.cs中,输入以下内容:

string commandID = "RestartPC";

        IAsyncAction operation = FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync(commandID);

启动应用程序时,powershell窗口会弹出一秒钟,然后关闭,但没有任何反应。

任何帮助将不胜感激。我在此线程中寻找了线索,但似乎没有任何作用。

UWP and FullTrustProcessLauncher missing in namaspeace

2 个答案:

答案 0 :(得分:1)

在“ fullTrustProcess”扩展名中指定的EXE必须是您程序包中的EXE。因此,针对您的方案的解决方案是在程序包中包含一个简单的EXE,然后仅调用Process.Start()或ShellExecute()来启动powershell。

要将任意参数从UWP传递到Powershell,可以将它们写入本地AppData,然后让助手EXE从那里提取它。这是一个如何在我的博客上执行此操作的示例: https://stefanwick.com/2018/04/06/uwp-with-desktop-extension-part-2/

答案 1 :(得分:0)

终于到了。

在App Manifest文件中,我这样输入:

<Extensions>
    <desktop:Extension Category="windows.fullTrustProcess" Executable="ConsoleApp1.exe">
  <desktop:FullTrustProcess>
        <desktop:ParameterGroup GroupId="RestartPC" Parameters="c:\mypath\Powershelldb.exe"/>
    <desktop:ParameterGroup GroupId="db" Parameters="c:\mypath\shutdowndb.exe"/>

      </desktop:FullTrustProcess>

然后我创建了一个具有以下代码的控制台c ++应用程序:

using System;
using System.IO;
using System.Diagnostics;
using System.Reflection;
class Program
{
static void Main(string[] args)
{
    try
    {

        if (args.Length != 0)
        {
            string executable = args[2];

            string path=Assembly.GetExecutingAssembly().CodeBase;
            string directory=Path.GetDirectoryName(path);
            Process.Start(directory+"\\"+executable);
            Process.Start(executable);
        }
    }
    catch (Exception e)
    {
        Console.WriteLine(e.Message);
        Console.ReadLine();
    }

}

}

然后我创建了要按如下方式运行的可执行文件:

#include "stdafx.h"
#include <iostream>


int main()
{
     system("start powershell.exe -command Restart-Computer");
     return 0;
}

然后在我的UWP应用中使用以下内容:

private async void doSomething()
    {


        string commandID = "db";

        ApplicationData.Current.LocalSettings.Values["parameters"] = commandID;

        await FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync(commandID);


    }

然后,Powershell启动并关闭我的计算机。显然这不是所有这些目的,但我想测试powershell命令:)

我发现了一个有用的线程here,对我们很有帮助。

也感谢Stefan的有用输入