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

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

时间:2023-06-30 13:44:47浏览次数:54  
标签:exe string 启动 Windows task API var td 终极

 

 

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、收尾

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

 

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

相关文章

  • Windows系统安装timescaledb
    TimescaleDB是基于PostgreSQL数据库打造的一款时序数据库,插件化的形式,随着PostgreSQL的版本升级而升级,不会因为另立分支带来麻烦。TimescaleDB具备以下特点1.基于时序优化2.自动分片(按时间、空间自动分片(chunk))3.全SQL接口4.支持垂直于横向扩展5.支......
  • windows下influxDB管理工具:InfluxDBStudio
    1、版本说明如下图2、版本发布网址:https://github.com/CymaticLabs/InfluxDBStudio/releases/tag/v0.2.0-beta.13、运行软件包4、创建连接连接设置使用“​​ConnectionSettings​​连接设置”对话框配置InfluxDB连接的详细信息:​​Name​​名称-连接的名称。这是使用......
  • ToggleSwitch ,MemoEdit多选文本框 MemoExEdit 多选文本框自带收缩
    ToggleSwitch   GlyphAlignment:设置复选框对其方式OnText/OffText:On/Off下显示的文本ValueOn/ValueOff:On/Off下的值和类型 事件:Toggle控件状态更改是触发获取值:stringa=this.toggleSwitch1.EditValue.ToString(); MemoEdit MaxLength:为0时无限制数据Scro......
  • CentOS7安装xrdp(Windows远程桌面连接Linux)
    前提:CentOS安装桌面,如果无桌面,请执行:yum-ygroupsinstall"GNOMEDesktop"startx方法一配置源yuminstallepel*-y安装xrdpyum--enablerepo=epel-yinstallxrdp 方法二1、安装xrdp更具自己的系统位数选择对应的包(如果是32位使用则选择i386,如果是64位,请选择x86_64),查......
  • Windows修改远程桌面端口
    1.打开注册表编辑界面2.依次打开:计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TerminalServer\WinStations\RDP-Tcp将PortNumber改为想要的端口值 ......
  • Windows下载MIUI+
    方法一命令行执行下面命令:wingetinstallXiaomi.MIUI+方法二去这个地址下载安装包如果这个地址失效了,请参考https://zhuanlan.zhihu.com/p/574307078下载安装包......
  • VScode连接WSL总是频繁断开连接,并且卡顿,导致windows系统崩溃
    vscode出现这种情况,原因在于win10自带的openSSH版本可能和vscode不太兼容,安装其他版本可能解决这个问题。本地使用的是win10自带的openSSH,版本是8.1p1。我们可以通过使用的是git自带的ssh版本来解决问题。解决办法:1.下载并安装git,网址:Git-Downloads(git-scm.com)配置环境......
  • C# WinForm开发,使用dnSpy-net-win32调试dll文件或.exe文件工具
     工具下载:https://download.csdn.net/download/haojuntu/87967457打开文件,加载需要调试文件 视图-》窗口-》模块断点,可以调试具体模块 找到要调试的模块,启动项目后,类似vs开发,可以一步步调试 ......
  • nvm-windows 使用
    nvm-windows使用node版本管理工具下载github地址:https://github.com/coreybutler/nvm-windows/releases使用直接nvm有说明报错proxy异常配置node国内镜像时,用错命令了(用成了nvmproxy),导致报错panic:runtimeerror:sliceboundsoutofrange[:4]withlength2,修......
  • Windows与Ubuntu使用共享文件夹
    由于从Windows主机往UnbuntuServer传输文件时,无论是使用SCP命令、SFTP还是FTP等方式,速度都奇慢,仅有几十kB/s。但是通过iperf发现网络连接速率是正常的,定位了很久都没有办法找出问题,最后只能通过在Windows与Ubuntu之间设置共享文件夹的方式解决文件传输的问题,否则传个几GB的文件要......