景德镇陶瓷网:「迁」移桌面程序到MS Store(14)——APPX嵌入WCF Service「以」Admin权限运行

2020-02-27 28 views 0

扫一扫用手机浏览

Serverless + Egg.js “后台管理系统实战”

Windows10 1809<版本开始>,〖微软又〗对UWP(开放了新的)Capability:AllowElevation。 『【通过】』这个新的[Capability,UWP APP《能够【 在[】运行时向用户请求》Admin《【权限】》,配合Windows 1607<版本就引入的>RunFullTrust Capability(「参考」《〖迁移桌面“程序”到〗MS Store(9)——APPX With Desktop Extension 》),我们可以让MS Store〖中的〗APP(拥有无限接近传统桌面“程序”的能力)。
【本篇】提到的Sample{工程位于全球最}大的同性交友平台GitHub:
https://github.com/manupstairs/UWPAllowElevation

上图解释了整个“程序”运行的流程,UWP APP『【通过】』RunFullTrust Capability{来运行一个}exe“程序”,【 在[】这个exe“程序”中,又因为新的AllowElevation‘而能够请求’Admin《【权限】》来启动WCF Servcie。用户【 在[】UAC 弹窗中确认授予[Admin《【权限】》后, 我们就【 在[】[UWP APP的身后拥有了一个具有Admin《【权限】》的WCF Service。
首先让我们‘创建’WCFBackgroundProcess工程,包含一个Hello World级别的WCF Service。『【 在[】该』(服务)的接口中,我们定义了三个方法,「用来启动」,停止和查询Windows Service状态。这么设计是因为这些操作需要Admin《【权限】》。

    [ServiceContract]
    public interface ILocalService
    {

        [OperationContract]
        ServiceControllerStatus StartService(string name);

        [OperationContract]
        ServiceControllerStatus StopService(string name);

        [OperationContract]
        ServiceControllerStatus GetServiceStatus(string name);
    }

WCFBackgroundProcess工程本身是一个Console类型的“程序”,作为exe「启动后」,我们就可以【 在[】UWP Client〖工程中〗,{添加}对WCFBackgroundProcess中(服务)的引用。具体可以「参考」《〖迁移桌面“程序”到〗MS Store(7)——APPX + Service》。

    class Program
    {
        static void Main(string[] args)
        {
            var selfHost = new ServiceHost(typeof(LocalServiceWrapper));

            selfHost.Open();

            Console.WriteLine("The service is ready.");

            // Close the ServiceHost to stop the service.
            Console.WriteLine("Press <Enter> to terminate the service.");
            Console.WriteLine();
            Console.ReadLine();
            selfHost.Close();
        }
    }

Launcher 工程是一个标准的[Console“程序”,【内容非常简单】,『【通过】』ProcessStartInfo《类来启动》WCFBackgroundProcess.exe。 该工程【 在[】[UWP{环境下所需的}AllowElevation我们【 在[】‘创建’Packaging“工程时会{添加}”。

    class Program
    {
        static void Main(string[] args)
        {
            string result = Assembly.GetExecutingAssembly().Location;
            int index = result.LastIndexOf("\\");
            string rootPath = $"{result.Substring(0, index)}\\..\\";

            rootPath += @"WCFBackgroundProcess\WCFBackgroundProcess.exe";

            ProcessStartInfo info = new ProcessStartInfo
            {
                Verb = "runas",
                UseShellExecute = true,
                FileName = rootPath
            };
            Process.Start(info);
        }
    }

接着‘创建’UWPClient工程,这是一个标准的UWP‘项目’。(除了)WCFBackgroundService‘的引用外’,我们还需要『【通过】』NuGet{添加}Windows Desktop Extension for the UWP来实现对Launcher.exe的调用(「参考」《〖迁移桌面“程序”到〗MS Store(9)——APPX With Desktop Extension 》)。

 

UWPClient仅包含唯一的MainPage,《四个》 按钮[『事件』《分别负责启动》Launcher.exe,启动、停止、查询BluetoothService的状态,【代码如下】:

Java{面试}—(消息队列)

    public sealed partial class MainPage : Page
    {
        private string serviceName = "bthserv";
        private LocalServiceClient client = new LocalServiceClient();

        public MainPage()
        {
            this.InitializeComponent();
        }

        private async void StopButton_Click(object sender, RoutedEventArgs e)
        {
            var status = await client.StopServiceAsync(serviceName);
            textBlockStatus.Text = status.ToString();
        }

        private async void StartButton_Click(object sender, RoutedEventArgs e)
        {
            var status = await client.StartServiceAsync(serviceName);
            textBlockStatus.Text = status.ToString();
        }

        private async void QueryButton_Click(object sender, RoutedEventArgs e)
        {
            var status = await client.GetServiceStatusAsync(serviceName);
            textBlockStatus.Text = status.ToString();
        }

        private async void RunWCFService_Click(object sender, RoutedEventArgs e)
        {
            if (ApiInformation.IsApiContractPresent("Windows.ApplicationModel.FullTrustAppContract", 1, 0))
            {
                await FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync();
            }
        }
    }

<以上就是所有的准>备工作。然后我们‘创建’作为启动‘项目’的AllowElevationPackaging工程(「参考」《〖迁移桌面“程序”到〗MS Store(1)——『【通过】』Visual Studio‘创建’Packaging工程》)。【 在[】AllowElevationPackaging的Applications中包含之前‘创建’的所有三个工程,同时将UWPClient‘设为’Entry Point。

右键选中[Package.aapxmanifest〖后进行编辑〗,【 在[】<Application/>【节点】中{添加}:

      <Extensions>
        <desktop:Extension xmlns:desktop="http://schemas.microsoft.com/appx/manifest/desktop/windows10" Category="windows.fullTrustProcess" Executable="Launcher\Launcher.exe" />
      </Extensions>

同时修改Capabilities【节点】:

  <Capabilities>
    <Capability Name="internetClient" />
    <rescap:Capability Name="runFullTrust" />
    <rescap:Capability Name="allowElevation" />
  </Capabilities>

完成后保存关闭文件[,大功告成!编译整个解决方案确保没有任何错误,然后让我们点击F5开始运行(记得将AllowElevationPackaging‘设为’启动项)。
‘首先我们先点击’Apply for Elevation capability and Run WCF Service 按钮[。【 在[】UAC(窗口中我们同意给予)Admin《【权限】》,WCF Service『顺利启动』。感兴趣的同学可以『【通过】』窗口的标题栏查看WCFBackgroundProcess.exe的物理路径。

然后我们即可以开始查询蓝牙(服务)的运行状态了。 如果用的是蓝牙鼠标[,【 在[】点击Stop Blue Support Service《的同时不要惊慌失措哦》。{本篇作为}《〖迁移桌面“程序”到〗MS Store》系列的最终篇,“没人看的系列就准备太监了”。犹豫就会败北,果断就会白给。〖后续博客将专注于〗.NET Core<的学习>,「与诸君共勉」!

GitHub:
https://github.com/manupstairs/UWPAllowElevation

,

阳光【 在[】线

阳光【 在[】线www.leegalo.com(原诚信【 在[】线)现已开放阳光【 在[】线手机版下载。阳光【 在[】线游戏公平、公开、公正,「用实力赢取信誉」。

Allbet网站内容转载自互联网,如有侵权,联系Allbet删除。

本文链接地址:http://www.zdtfy.com/post/1157.html

相关文章

发表评论