首页 > 系统相关 >Windows服务启动exe无界面终极解决方案

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

时间:2023-07-02 14:00:26浏览次数:51  
标签:exe string 启动 Windows task API var td 终极

摘自:https://www.cnblogs.com/ZoeWong/p/17516579.html

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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 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,你程序的目录获取时要注意了。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 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、收尾

  哈哈,这个方法怎么样。彻底么?

 

  好文要顶 关注我 收藏该文  

标签:exe,string,启动,Windows,task,API,var,td,终极
From: https://www.cnblogs.com/xcj26/p/17520726.html

相关文章

  • ScheduledThreadPoolExecutor.setExecuteExistingDelayedTasksAfterShutdownPolicy(bo
    MethodSummary voidexecute(Runnable          Executecommandwithzerorequireddelay. booleangetContinueExistingPeriodicTasksAfterShutdownPolicy()          Getthepolicyonwhethertocontinueexecutingexistingperiodictaskseven......
  • jar文件打包成exe以及生成安装程序
    仅以此文献给还在为打包jar文件而徘徊挣扎的朋友...所需工具下载地址如下:launch4j(jar-->exe)Setup.zip(exe-->安装程序) jar-->exe-->安装程序详细步骤如下: 1.解压下载好的launch4j,并打开其中的launch4j.jar或者launch4j.exe。  2.打开之后launch4j后,如下图:step1:选择你的jar文......
  • Windows系统安全的个人设置
    安全有一个很宽泛的范围,我们限定一下讨论的范围个人计算机的以下几个方面:网络安全恶意软件错误设置数据安全硬件故障讨论上下文个人电脑或工作电脑,工作组环境下,登录账户是管理员,没有集中部署的安全软件,没有购买付费的安全软件。我个人电脑关于安全的的设置,贴出来供大家参......
  • markdown终极指南
    markdown是我一直在用的一种语法,本文想把他的各个方面的特性系统的介绍一下,方便去做一些查阅和学习。介绍Markdown易于阅读,方便创作web文档,利于各平台无缝分发。Markdown语法灵感最大的来源还是纯文本email的格式,完全由标点符号标签组成的纯文本。Markdown文件应该......
  • windows 11 开启 hyper-v
    之前最好创建一个还原点。保存以下为一个bat文件,如hyperv.batpushd"%~dp0"dir/b%SystemRoot%\servicing\Packages\*Hyper-V*.mum>hyper-v.txtfor/f%%iin('findstr/i.hyper-v.txt2^>nul')dodism/online/norestart/add-package:"%SystemRoo......
  • windows上编译jdk
    目录Windows上编译jdk21环境准备编译Windows上编译jdk21参考文档:https://openjdk.org/groups/build/doc/building.html环境准备编译jdk需要unix环境,在windows上可以使用WSL或Cygwin.建议修改系统语言为英语(美国).笔者这里使用Cygwin,建议安装64位的Cygwin......
  • Windows兼容模式怎么设置?140.210.18.x
    服务器兼容是什么意思?服务器兼容性怎么改?兼容性(compatibility)是指硬件之间、软件之间或是软硬件组合系统之间的相互协调工作的程度。兼容的概念比较广,相对于硬件来说,几种不同的电脑部件,如CPU、主板、显示卡等,如果在工作时能够相互配合、稳定地工作,就说它们之间的兼容性比较好,反之就......
  • 51.pyinstaller打包后,打开exe程序提示SyntaxError: Non-UTF-8 code starting with '\
    最后开发了一款小工具,然后确定一切测试没有问题,想通过pyinstaller将其打包成exe,像类似的打包以前也经常打包的,复杂一点的也都是打包成功的,但这里感觉程序很简单,打包居然出现了以下错误。我的python版本是3.8.9,然后pyinstaller版本是5.9.0,不知道会不会是版本不兼容的问题,看网上哪......
  • Windows 10 跳过创建账户的方法:
     跳过创建账户的方法:1.在创建账户的前一页,按下shift+f10组合键,启动命令提示符。2.在命令提示符当中输入下面命令:netuseradministrator /active:yes3.按下ctrl+shift+f3重启计算机,然后就可以启用内置账户了,就能够跳过创建账户了。  ......
  • windows的cmd批处理命令及powershell (二)
    1、变量设置for/l%%iin(1,1,100)do@echo%%iset/ai=500set/ai=%i%+200echo%i%pause++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@echooffSETLOCALENABLEDELAYEDEXPANSIONfor/l%%iin(1110)do(set/avar=%%i+2echo!var!......