迁移桌面程序到MS Store(14)——APPX嵌入WCF Service以Admin权限运行
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的状态,代码如下:
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", , ))
{
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
迁移桌面程序到MS Store(14)——APPX嵌入WCF Service以Admin权限运行的更多相关文章
- 迁移桌面程序到MS Store(8)——通过APPX下载Win32Component
在上一篇<迁移桌面程序到MS Store(7)——APPX + Service>中,我们提到将desktop application拆分成UI Client+Service两部分.其中UI ...
- 迁移桌面程序到MS Store(9)——APPX With Desktop Extension
在<迁移桌面程序到MS Store(8)——通过APPX下载Win32Component>中我们讨论了通过APPX来下载Service部分的安装包.但是纯UWP的客户端并不能自动运行下载的 ...
- 迁移桌面程序到MS Store(5)——.NET Standard
接下来的几篇,我想讨论下迁移桌面程序到MS Store,可以采用的比较常见.通用性比较强的实施步骤和分层架构. 通常商业项目一般都是不断的迭代,不太可能突然停止更新现有的桌面版本,然后花很长时间从头来 ...
- 迁移桌面程序到MS Store(1)——通过Visual Studio创建Packaging工程
之前跑去做了一年多的iOS开发,被XCode恶心得不行.做人呢,最重要的是开心.所以我就炒了公司鱿鱼,挪了个窝回头去做Windows开发了. UWP什么的很久没有正儿八经写了,国内的需求 ...
- 迁移桌面程序到MS Store(10)——在Windows S Mode运行
首先简单介绍Windows 10 S Mode,Windows在该模式下,只能跑MS Store里的软件,不能通过其他方式安装.好处是安全有保障,杜绝一切国产流氓软件.就像iOS一样,APP进商店都需 ...
- 迁移桌面程序到MS Store(12)——WPF使用UWP InkToolbar和InkCanvas
我们在<迁移桌面程序到MS Store(4)——桌面程序调用Win10 API>提到了对Win10 API的调用,但仍存在无法在WPF中使用UWP控件的问题,虽然都是XAML控件,但却是两 ...
- 迁移桌面程序到MS Store(13)——动态检查Win10 API是否可用
假设我们现有一个WPF程序,需要支持1903以前的Windows 10版本.同时在1903以后的版本上,额外多出一个Ink的功能.那么我们就可以通过ApiInformation.IsApiContra ...
- 迁移桌面程序到MS Store(2)——Desktop App Converter
迁移传统桌面程序到MS Store的另一种方式是使用Desktop App Converter工具.虽然本篇标题包含了Desktop App Converter(以下简称DAC),实际上我是来劝你别用 ...
- 迁移桌面程序到MS Store(3)——开机自启动
迁移桌面程序的时候,有可能你会遇到这么个需求——开机自启动.Windows传统桌面程序的传统陋习.不论什么奇葩软件都想要开机自启动,默认就给你打开,一开机哐哐哐什么雷,什么企鹅都蹦出来,也不管你用不用 ...
随机推荐
- Xcode10:library not found for -lstdc++.6.0.9 临时解决
1.https://pan.baidu.com/s/1IkbZb6qaxgvghP1HEFQa6w?errno=0&errmsg=Auth%20Login%20Sucess&& ...
- 「2.0」一个人开发一个App,小程序从0到1,文件剖析
不知你是不是见到“文件剖析”这4个大字,才点进来看一看的?如果真是的话,那我可以坦诚.真心.负责任地告诉你:你上当了,你上了贼船啦,如果你现在想跳的话,还来得及,反正茫茫大海中,鲨鱼正缺搞程序的人.说 ...
- python scoket
一.简介 scoket(套结字)在python就是模块 二.分类 基于文件型(不用) 基于网络型 名字:AF_INET AF_INET6 三.scoket应用 1.基于tcp 长连接:基于tcp的Se ...
- 7.JavaSE之类型转换
类型转换: 由于Java是强类型语言,所以要进行运算的时候,需要用到类型转换. 图中优先级从低到高,小数优先级大于整数. 运算中,不同类型的数据需要转换为同一类型,然后进行运算. 强制类型转换:(类型 ...
- 从0开发3D引擎(七):学习Reason语言
目录 上一篇博文 介绍Reason Reason的优势 如何学习Reason? 介绍Reason的部分知识点 大家好,本文介绍Reason语言以及学习Reason的方法. 上一篇博文 从0开发3D引擎 ...
- atx测试框架实现手机应用UI自动化测试
最近工作中遇到游戏APP需要实现UI自动化测试,这个app中真的是典型的混合App,有Android原生控件,有webview控件,以及游戏操作页面.研究了Appium,发现appium实现跨应用操作 ...
- 【阿K学Python系列】一Python基础语法(二)
前言 通过上一章的学习[阿k学Python]一Python入门(一),我们已经初步了解到Python是一种解释型.面向对象.动态数据类型的高级程序设计语言,当然也是一门脚本语言,像前端需要学习的Jav ...
- GIMP(Linux下的Photoshop),Centos7下安装过程
点当然是上官网:https://www.gimp.org/ 这英语看不懂,果断用谷歌的网页翻译. 点下载,就会有 看到这个,就点 下载一个安装的包 用命令行打上 [root@localhost 下载] ...
- flutter 与 android 混合开发
现有的混合开发方式,都是存flutter项目在android系统或者iOS上面跑. 但是,实际情况是,我们需要在一个成熟的native项目上面,跑几个flutter页面,逐步的进行flutter的融合 ...
- CTF--HTTP服务--命令执行(使用集成工具测试)
开门见山 1. 扫描靶机ip,发现PCS 192.168.1.158 2. 用sparta工具对靶机进行信息探测 3. 扫描结果 4. 在浏览器中查看80端口的页面 5. 查看网站信息 6. 暴力破解 ...