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。例子为:https://github.com/dahall/TaskScheduler/wiki/Examples
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 ();
}
注意,注意,再注意:A、此方法是win10的,因为win10默认屏蔽Administrator用户,我用户属于这个组,所以我这个地方使用这种方式没有问题。但是,其他非Administrators组用户登录可能不行了,那也好解决,将下面代码中GroupPrincipal改为UserPrincipal,用它去找登录的用户名,上面代码设userid,logontype就行。或者输入正确的组名都可以;B、此方式程序的启动位置为System32,你程序的目录获取时要注意了。
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://files.cnblogs.com/files/ZoeWong/TaskScheduler.2.10.1%E5%8C%85.rar?t=1688102826&download=true
6、收尾
哈哈,这个方法怎么样。彻底么?


Windows服务启动exe无界面终极解决方案的更多相关文章
- VS2012编译的Windows服务启动后立即停止的解决方案
ATL中的BUG,在没有COM的服务中,使用_ATL_NO_COM_SUPPORT. 并在服务中添加下面的代码 #if defined(_ATL_NO_COM_SUPPORT) HRESULT Pre ...
- 玩转Windows服务系列——无COM接口Windows服务启动失败原因及解决方案
将VS创建的Windows服务项目编译生成的程序,通过命令行 “服务.exe -Service”注册为Windows服务后,就可以通过服务管理器进行管理了. 问题 通过服务管理器进行启动的时候,发现服 ...
- 转 Oracle监听器启动出错:本地计算机上的OracleOraDb11g_home1TNSListener服务启动后又停止了解决方案
今早刚上班.客户打电话过来说系统访问不了,输入用户名.用户号不能加载出来!听到这个问题,第一时间想到的是不是服务器重新启动了,Oracle数据库的相关服务没有启动的原因.查看服务的时候,发现相关的服务 ...
- 玩转Windows服务系列——Windows服务启动超时时间
最近有客户反映,机房出现断电情况,服务器的系统重新启动后,数据库服务自启动失败.第一次遇到这种情况,为了查看是不是断电情况导致数据库文件损坏,从客户的服务器拿到数据库的日志,进行分析. 数据库工作机制 ...
- windows服务启动 1053错误
1.问题描述 今天在启动一个Windows服务时,服务启动不了,且提示:1053错误 那么是什么导致了1053错误呢? 2.他山之石 百度了一下,发现有人作出下面的解释并给出了解决方法: “常常是因为 ...
- Windows服务启动进程----Cjwdev.WindowsApi.dll
windows服务下无法启动外部程序 做一个windows服务监听服务,涉及到windows服务启动外部程序的一个过程,但是调试测试发现,无法简单的用process.start()这种方法, 原因是在 ...
- C#穿透session隔离———Windows服务启动UI交互程序
在Windows服务里面启动其他具有界面的应用程序,需要穿透session隔离,尝试了很多种方法,都可行,现在一一列举下来,并写下几个需要注意的地方. 需要注意的地方 首先要将服务的Account属性 ...
- MongoDB做为一项windows服务启动
MongoDB做为一项windows服务启动 Windows版本安装 MongoDB的官方下载站是http://www.mongodb.org/downloads,可以去上面下载最新的对应版本,有32 ...
- C#创建服务及使用程序自动安装服务,.NET创建一个即是可执行程序又是Windows服务的exe
不得不说,.NET中安装服务很麻烦,即要创建Service,又要创建ServiceInstall,最后还要弄一堆命令来安装和卸载. 今天给大家提供一种方式,直接使用我们的程序来安装/卸载服务,并且可以 ...
- [转]C#创建服务及使用程序自动安装服务,.NET创建一个即是可执行程序又是Windows服务的exe
写在前面 原文地址:C#创建服务及使用程序自动安装服务,.NET创建一个即是可执行程序又是Windows服务的exe 这篇文章躺在我的收藏夹中有很长一段时间了,今天闲着没事,就自己动手实践了一下.感觉 ...
随机推荐
- [Linux]CentOS查看RPM包依赖问题
[经典应用案例] 查看此文前,可先查看 此博文中:在安装软件过程中,如何解决的依赖组件问题? [数据库/Linux]CentOS7安装MySQL Percona版(RPM方式) : 2-1 依赖组件问 ...
- odoo 开发入门教程系列-添加修饰
添加修饰 我们的房地产模块现在从商业角度来看是有意义的.我们创建了特定的视图,添加了几个操作按钮和约束.然而,我们的用户界面仍然有点粗糙.我们希望为列表视图添加一些颜色,并使一些字段和按钮有条件地消失 ...
- vulnhub靶场之DRIFTINGBLUES: 5
准备: 攻击机:虚拟机kali.本机win10. 靶机:DriftingBlues: 5,下载地址:https://download.vulnhub.com/driftingblues/driftin ...
- 为什么C++语言性能优越?
面试时被问到这个问题,发现自己一直以来理所当然的认为C++快,却没有具体分析原因.下面简单总结一下为什么快. 当我们编写程序时,我们需要将程序转换为计算机可以理解的机器语言.不同的语言有不同的执行机制 ...
- 关于java中的super
首当其冲先说一下super的用途和含义.他是用于调用一些被重写的方法. 这里还可以复习一下子这个重写:重写是把新的方法放在被重写的方法前面.在被重写的子类中,优先调用重写后的方法.但是如果想要调用原本 ...
- Node + Express 后台开发 —— 上传、下载和发布
上传.下载和发布 前面我们已经完成了数据库的增删改查,在弄一个上传图片.下载 csv,一个最简单的后台开发就已完成,最后部署即可. 上传图片 需求 需求:做一个个人简介的表单提交,有昵称.简介和头像. ...
- Golang每日一库之regex
本文地址: https://www.cnblogs.com/zichliang/p/17387436.html Golang日库合集:https://www.cnblogs.com/zichliang ...
- 2022-08-10:为了给刷题的同学一些奖励,力扣团队引入了一个弹簧游戏机, 游戏机由 N 个特殊弹簧排成一排,编号为 0 到 N-1, 初始有一个小球在编号 0 的弹簧处。若小球在编号为 i 的弹
2022-08-10:为了给刷题的同学一些奖励,力扣团队引入了一个弹簧游戏机, 游戏机由 N 个特殊弹簧排成一排,编号为 0 到 N-1, 初始有一个小球在编号 0 的弹簧处.若小球在编号为 i 的弹 ...
- 2022-02-16:将数组分割成和相等的子数组。 给定一个有 n 个整数的数组,你需要找到满足以下条件的三元组 (i, j, k) : 0 < i, i + 1 < j, j + 1 < k < n
2022-02-16:将数组分割成和相等的子数组. 给定一个有 n 个整数的数组,你需要找到满足以下条件的三元组 (i, j, k) : 0 < i, i + 1 < j, j + 1 & ...
- Git开发、发布、缺陷分离模型概述(支持master/develop/feature/release/hotfix类型分支)
Git是什么? Git是一种分布式版本控制系统,它可以记录文件的修改历史和版本变化,并可以支持多人协同开发.Git最初是由Linux开发者Linus Torvalds创建的,它具有高效.灵活.稳定等优 ...