Windows服务启动exe无界面终极解决方案

1、前言

        我这个方案(C#操作)是彻底解决【从Windows服务启动程序exe,程序无界面】问题的终极解决方案,终极方案,绝对的终极方案,本来打算收钱的,还是算了,你们也不容易,关注我一下就行。后附代码下载地址。

        由于安全性问题,Vista以后的Windows都会出现该问题,从服务中调用/启动其他程序出现无界面,但是任务管理器中可以看到已经成功启动,就是无操作界面,具体出现该状况的原因大家自行搜索。我的方法绝对可行。

2、网上方案

        网上有各种各样的方案,绝大部分都有一样的,都是是调用系统API,CreateProcess之类的API,然并卵,并不能彻底解决。

3、我的方案

        我的方案极其简单而不粗暴,反而优美。

3.1、简单不粗暴

        我的方案是使用计划任务功能启动指定程序。任务计划的启动不受服务限制,和服务的边界不太一样。不需要特别多的代码就可以实现,其实就是实现添加任务计划,简单吧。API方式,光结构和调试就够你们喝一壶了,还得通过其他API调用和设置其他信息,比如创建和复制现有执行令牌(DuplicateTokenEx方法),实现这功能粗暴得狠。我这个不用,啥都不用。

3.2、优美

        创建任务寥寥十几行代码,优美得狠。

4、实现过程

        实现过程即任务计划实现过程,C#有3种方法,其实就是2种,一种是使用API创建任务,这个方法其实,可以通过系统调用现有dll库实现,最后一种是使用开源库。建议用开源库方式。

        调用系统的dll,这dll就是C:\Windows\System32\taskschd.dll,在C#里直接引用就行,它实现API的C#封装,很简单。使用TaskSchedulerClass类连接、创建修改任务计划,很简单,我这不是主推方法,不贴代码,但源码地址里有。

        使用开源库TaskScheduler,可以实现,命名空间为Microsoft.Win32.TaskScheduler,下载地址为:https://github.com/dahall/TaskScheduler。例子为Examples · dahall/TaskScheduler Wiki · GitHub

    public static void AddOrRunWinTask( string sTaskName, string sExePath, string sArgs = null ){var task = TaskService.Instance.FindTask(sTaskName, true);if ( task != null ){task.Definition.Triggers[0].StartBoundary = DateTime.Now.AddSeconds ( 10 );task.RegisterChanges ();}else{var td = TaskService.Instance.NewTask ();td.RegistrationInfo.Author = "白羊佐CSDN";td.RegistrationInfo.Description = "用于跨域启动特定程序";td.Settings.ExecutionTimeLimit = TimeSpan.Zero;//td.Settings.DisallowStartIfOnBatteries = false;td.Settings.RunOnlyIfIdle = false;td.Settings.RunOnlyIfNetworkAvailable = false;//此处注意,如果你待启动程序需要管理员权限运行,必须使用Highest,否则使用LUA就行td.Principal.RunLevel = TaskRunLevel.Highest;//获取Administrators的GroupIDstring sGpId = GetGroupID();//此处最为关键,如果不指定用户名ID或组名ID,依旧不显示界面,因为创建时的用户为SYSTEMtd.Principal.GroupId = sGpId;var trigger = (TimeTrigger)td.Triggers.Add( new TimeTrigger() );trigger.StartBoundary = DateTime.Now.AddSeconds ( 10 );trigger.ExecutionTimeLimit = TimeSpan.Zero;trigger.Enabled = true;td.Actions.Add ( new ExecAction ( sExePath, sArgs ) );task = TaskService.Instance.RootFolder.RegisterTaskDefinition ( sTaskName, td );}//打开表示立即运行//var rz = task.Run ();}

       

    private static string GetGroupID (){string sGid = null;System.DirectoryServices.AccountManagement.PrincipalContext pc = new System.DirectoryServices.AccountManagement.PrincipalContext(System.DirectoryServices.AccountManagement.ContextType.Machine);var identity = System.DirectoryServices.AccountManagement.GroupPrincipal.FindByIdentity(pc, "Administrators");if ( identity != null ){sGid = identity.Sid.Value;}return sGid;}

完工,收工,以上代码完全可以实现,没必要现在我的源代码了。省钱。

5、源代码地址

https://download.csdn.net/download/fisher_china/87966293

6、附件和工具的地址

https://download.csdn.net/download/fisher_china/87966356

7、最后

        一毛钱也是爱,就看我这方法给你解决了多大问题,不捐完全没关系,年纪大了不会管理……哈哈,哈哈,不转没有关系的哦,没有道德绑架,贴上我的支付宝收款码。

就这样吧。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/650.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【前端工程化】深入浅出vite(二)--vue3全家桶+ts构建后管系统

安装基础包 npm create vitelatest # 这里选择的是VueTypescript的组合 cd vue-admin npm install# 先安装基础包 npm install vue-router4 npm i pinia npm i axios npm install sass --save-dev npm install element-plus --save npm install element-plus/icons-vue npm in…

如何访问NetApp E系列存储的CLI命令行

NetApp存储的E系列(e-series)是收购LSI存储而来的,所以这个产品的install base,也就是安装量其实是很大的,因为早期LSI的商业模式就是OEM,给很多的IT公司做过OEM,比较典型的就是IBM的早期的DS存…

浅谈电瓶车充电桩运营方案 安科瑞 许敏

1. 概述 电动车火灾事故频频发生,毫不起眼的电动车屡次引发夺命大火,电动车已然成为火灾“重灾区”。为预防和遏制电动自行车火灾事故发生,三令五申各种政策,为此安委会曾出台《电动自行车集中停放和充电治理方案》。 大部分充电过…

MySQL日志管理、备份与恢复

文章目录 MySQL日志管理、备份与恢复1 MySQL日志管理1.1 日志的分类1.2 日志的配置1.3 日志查询1.3.1 查看通用查询日志是否开启1.3.2 查看二进制日志是否开启1.3.3 查看慢查询日志功能是否开启1.3.4 查看慢查询时间设置1.3.5 在数据库中设置开启慢查询的方法 2 数据备份2.1 数…

freemarker 使用word模板赋值

1. 引包<dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.28</version></dependency>word文档工具类import freemarker.template.Configuration; import freemarker.template.…

数据库实验-图书销售管理系统数据库安全管理

一、实验二&#xff1a;图书销售管理系统数据库安全管理 三、实验目的 了解该DBMS系统对数据库管理的内容与方法&#xff0c;特别是理解数据库安全机制和作用&#xff0c;以及PostgreSQL数据库角色管理、用户管理、权限管理的基本方法&#xff0c;培养数据库管理能力。在图书…

Mysql(Linux数据库或者在Navicate中)

Mysql数据库组成 服务端:主要存储数据,并接收用户发过来的SQL语句,并执行结果返回给客户端 客户端:下发用户要执行的sql语句,并显示服务器返回的执行结果 命令行数据库连接方式 mysql -h 数据库 IP -P 端口号 -u 数据库登录用户名 -p 数据库登录密码 -h不加表示为本机,-P不…

Java-String、StringBuffer、StringBuilder区别及相关面试题

目录 一、引言二、String类的基本介绍2.1 创建String对象2.2 字符串的拼接和连接2.3 字符串的比较2.4 字符串的截取和替换2.5 字符串的查找和匹配2.6 创建格式化字符串API文档 三、StringBuffer类的基本介绍3.1 创建StringBuffer对象3.2 字符串的拼接和连接3.3 字符串的插入和删…

简单易用多git服务器ssh密钥配置管理

文章目录 前言一、什么是ssh-key二、配置步骤添加ssh-key配置多ssh-key 总结 前言 快速理解如何配置管理多个git服务器的ssh&#xff0c;当我们有多个git帐号时会涉及如何管理不同的remote使用不同的git账户登陆推送 当前repo的origin remote是github&#xff0c;我们在推送时…

pytorch量化库使用(2)

FX Graph Mode量化模式 训练后量化有多种量化类型&#xff08;仅权重、动态和静态&#xff09;&#xff0c;配置通过qconfig_mapping &#xff08; prepare_fx函数的参数&#xff09;完成。 FXPTQ API 示例&#xff1a; import torch from torch.ao.quantization import (ge…

【MySQL数据库 | 第十九篇】SQL性能分析工具

目录 前言&#xff1a; SQL执行频率&#xff1a; 慢查询日志&#xff1a; profile&#xff1a; profile各个指令&#xff1a; 总结&#xff1a; 前言&#xff1a; 本篇我们将为大家讲解SQL性能的分析工具&#xff0c;而只有熟练的掌握了性能分析的工具&#xff0c;才可以更…

C语言学习(二十九)---内存操作函数

在上一节内容中&#xff0c;我们学习了有关字符串操作的函数&#xff0c;其中分为了限制长度和不限制长度两种方式&#xff0c;虽然上节内容已经在很大程度上有助于程序的实现&#xff0c;但是其有一个致命的缺陷&#xff0c;聪明的你一定已经猜到了吧&#xff0c;对的&#xf…