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

news2024/11/25 4:26:55

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的GroupID
            string sGpId = GetGroupID();
            //此处最为关键,如果不指定用户名ID或组名ID,依旧不显示界面,因为创建时的用户为SYSTEM
            td.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.coloradmin.cn/o/701751.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络安全(自学笔记)

如果你真的想通过自学的方式入门web安全的话,那建议你看看下面这个学习路线图,具体到每个知识点学多久,怎么学,自学时间共计半年左右,亲测有效(文末有惊喜): 1、Web安全相关概念&am…

Redis 性能管理/优化 缓存雪崩/击穿/穿透

---------------------- Redis 性能管理 ---------------------------------------- ----- 查看Redis内存使用 ----- info memoryredis-cli -a abc123 info memory ----- 内存碎片率 ----- used_memory_rss:是Redis向操作系统申请的内存。used_memory:是…

缺失concrt140.dll下载,找不到concrt140.dll的解决方法

我们平时在打开 Adobe 应用程序、Halo、Forza Horizon 5 等时,可能会遇到找不到 concrt140.dll。因此,这不是特定于某个应用程序的问题。如果没有安装正确的 DLL,应用程序将无法正常工作,因为它们的代码依赖于这些库中编写的代码。…

井盖异动监测传感器:井盖的安全守护者

随着城市化进程的不断加速,城市道路、人行道上的井盖扮演着重要的角色。然而,由于各种因素,如车辆冲击、材料老化等,井盖常常会出现异动情况,井盖异动不仅对行车和行人的安全构成威胁,还给城市基础设施的维…

C#扩展——Visual Studio 代码提示/智能提示字体大小更改方法.

声明:本文为个人笔记,用于学习研究使用非商用,内容为个人研究及综合整理所得,若有违规,请联系,违规必改。 C#扩展——Visual Studio 代码提示/智能提示字体大小更改方法. 文章目录 C#扩展——Visual Studio…

【期末总复习】医学影像学(第2版)周翔平

【选择】 1、垂体腺瘤大小范围这么界定的&#xff1f; P66&#xff0c;肿瘤直径<1cm称为垂体微腺瘤&#xff0c;>1cm称为垂体大腺瘤&#xff0c;>4cm成为巨大腺瘤。 2、当一个车祸伤病人&#xff0c;怀疑长骨骨折首选什么检查方法&#xff1f; P387 X线平片 3、…

leetcode957. N 天后的牢房(java-14天周期优化)

N 天后的牢房 leetcode957. N 天后的牢房题目描述解题思路Java 代码演示 算法专题 leetcode957. N 天后的牢房 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/prison-cells-after-n-days 题目描述 监狱中 8 间牢房排成一…

力扣 106. 从中序与后序遍历序列构造二叉树

题目来源&#xff1a;https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal/description/ C题解&#xff1a;中序遍历是左中右&#xff0c;后序遍历是左右中&#xff0c;所以拿到两个遍历数组&#xff0c;我们可以从后序遍历获取中间节点…

信号链噪声分析6

目录 概要 整体架构流程 技术名词解释 技术细节 公用时钟源相位噪声的消除 公用电源噪声的消除 小结 概要 提示&#xff1a;这里可以添加技术概要 放大器输出被发送到均衡混频器&#xff08;相位检测器&#xff09;。相位检测器将两 个信号混合&#xff0c;在其输出处产生和积…

Apollo无人驾驶平台中多传感器标定

传感器标定是无人车最基础也是最核心的模块之一。作为软件层提供的第一项服务,标定质量和准确度极大地影响着感知、定位地图、PNC等模块。在 Apollo 开源自动驾驶平台中,我们提供了丰富的多传感器标定服务,如激光雷达、惯导、摄像头、多普勒雷达等多种传感器之间的标定。算法…

pytorch 中 dim 的-1,0,1,2 的意义 详解

对于3维矩阵&#xff0c;dim为-1时 与 dim为2时 的效果是一样的。dim为0时 从0维度&#xff0c; 下图 是三维实例 图的目的是 可以由一个想象的空间。 下面代码 与上图关系不大 >>> ab torch.tensor([[[0,1,2,3],[1,2,3,4]],[[2,3,4,5],[4,5,6,7]],[[5,6,7,8],…

如何解决failed to load steamui.dll这个问题?

当你在玩steam的时候&#xff0c;电脑突然弹出一个failed to load steamui.dll的时候&#xff0c;相信你内心一定是非常的烦躁的&#xff0c;毕竟你的玩游戏体验直接中断了&#xff0c;今天小编就来给大家详细的讲解一下怎么解决failed to load steamui.dll这个问题。 目录 一…

leetcode消失的数字

题目描述 数组 nums 包含从 0 到 n 的所有整数&#xff0c;但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在 O ( n ) O(n) O(n) 时间内完成吗&#xff1f; 示例 1&#xff1a; 输入&#xff1a;[3,0,1] 输出&#xff1a;2 leetcode链接&#xff1a;消失的数字 ⭕…

举例说明什么是卷积神经网络

卷积神经网络&#xff08;Convolutional Neural Network, CNN&#xff09;是一种深度学习模型&#xff0c;主要应用于计算机视觉任务&#xff0c;如图像分类、物体检测等。它通过卷积层、池化层和全连接层等组件来实现对图像的特征提取和分类。 现在我们以一个简单的图像分类任…

【算法题】动态规划中级阶段之跳跃游戏、最大子数组和、解码方法

动态规划中级阶段 前言一、最大子数组和1.1、思路1.2、代码实现 二、跳跃游戏2.1、思路2.2、代码实现 三、解码方法3.1、思路3.2、代码实现 总结 前言 动态规划&#xff08;Dynamic Programming&#xff0c;简称 DP&#xff09;是一种解决多阶段决策过程最优化问题的方法。它是…

计算机组成原理(期末或考研备考)- 存储器(RAM和ROM重点讲解)

存储器分类 主存储器&#xff1a;也称内存&#xff0c;存放正在运行程序和数据&#xff0c;CPU可以直接访问&#xff0c;容量存储较小&#xff0c;价格较贵。辅助存储器&#xff1a;也称外存&#xff08;绝大多数是磁盘&#xff09;&#xff0c;存放电脑的应用程序等&#xff0…

CentOS7使用Nginx部署前后端分离项目

CentOS7使用Nginx部署前后端分离项目 CentOS7安装使用Nginx1.安装1.1下载1.2 检验服务器上是否有nginx1.3 解压安装1.4 验证 2.部署2.1基本知识2.1.1常用命令2.1.2配置文件 2.2 配置效果前端后端 CentOS7安装使用Nginx 本文使用的nginx版本为1.22.1 Nginx发布版本分为主线版本…

Ant-Design 中a-transfer穿梭框 组件的使用

这段代码是一个包含模态框&#xff08;Modal&#xff09;和穿梭框&#xff08;Transfer&#xff09;的Vue组件。下面我会逐行解释代码的含义。 <a-modaltitle"合并":visible"visible"ok"handleOk"cancel"handleCancel"width"1…

基于51单片机串口加密系统(分主机从机)

目录 基于51单片机串口加密系统&#xff08;分主机从机&#xff09;一、原理图二、部分代码三、视频演示 基于51单片机串口加密系统&#xff08;分主机从机&#xff09; 功能&#xff1a; 1.通过两个单片机串口实现信息的加密和解密 2.按键完成信息的选择和发送 3.通过屏幕实时…

【Python】列表和元组

文章目录 一. 概念介绍二. 列表1. 创建列表2. 访问元素3. 切片操作4. 列表的遍历4.1 范围-for4.2 普通的 for 循环4.3 while 循环 5. 插入元素5.1 append() 方法5.2 insert() 方法 6. 删除元素6.1 pop() 方法6.2 remove() 方法 7. 查找元素7.1 in 和 not in 操作符7.2 index() …