假如要启动 this.exe。以下逻辑中会启动先后关联启动三个实例分别是ABC。先启动第一个实例A,A启动实例B,B启动实例C.

要求:

1.如果没有以管理员权限运行,则请求管理员权限运行,即使没有请求成功或请求成功之前,也要先以非管理员权限运行,因为它定时要执行一些任务,不能因阻塞而错过。

2.如果没有以管理员权限运行,也要可以动态申请以管理员权限来注册开机启动,然后托盘显示右键菜单指示是否已经设置开机启动。

3.支持Windows XP 到 Windows 10.

4.自启过程无需人工干预,全自动无阻塞。

5.不能关闭UAC,如果这个都关了,我们就不用讨论了。

要实现以上3点,其实并不容易,XP容易实现自不必说,从Vista开始就不那么容易了。

有两个难点:

1. 以管理员身份开机自启。注册表实现不了,启动菜单目录也实现不了。因为即使设置了程序的兼容性以管理员身份运行,但弹出的那个UAC确认框谁来点呢?据我所知,用计划任务是目前唯一可以实现以管理员身份启动并且不需要UAC确认的。

2. 当以非管理员身份运行时,动态申请管理员权限,当然这个是需要UAC确认的。

用来做一些人工设置的时候,这时候人是在电脑旁边的。比如设置开机自启,取消开机自启。

这个解决方案比较简单,实例A用RunAs方式申请管理员权限启动一个新实例B,传入命令行参数,B执行完自动结束。即使申请启动失败,A也可以继续存活,想要申请过程无阻塞就新开一个线程来做。

但有一个问题,B有没有启动成功?用户有没有在UAC确认时允许?即使是用户确认了,B成功在计划任务创建了开机以管理员身份启动。但是A依然无法判断是否成功设置了开机自启,托盘无法正确的为用户指示开机自启状态。有人会说查询一下计划任务里有没有我们创建的任务就行了,很可惜,因为A没有管理员权限,所以无法查询。

我其实也搞不懂,微软为什么查询计划任务都需要管理员权限。

既然B都有管理员权限了,它返回一个ExitCode不就行了。当然这样可以,但是开机自启是敏感操作,很可能被杀软干掉,这样我们的开机自启状态指示就变得不可靠。

有一个办法,B既然已经有了管理员权限,让它启动一个C,C就是一个完全有管理员权限的实例,B自我关闭,返回一个ExitCode给A,A收到通知也关闭,一切不就解决了嘛。这就是我的方案。

当然也可以不启动C,B关闭A,B继续以管理员权限运行,但是如何返回状态给A让A自我结束,或者B干掉A,就不是一个ExitCode可以解决的了,通讯或查找程序可能变得复杂。

下面附上创建、查询、删除计划任务的VB.NET代码:

Public Class Form1Private Const TASK_TRIGGER_LOGON = &H9Private Const TASK_ACTION_EXEC = &H0Private Const TASK_CREATE = &H2Private Const TASK_CREATE_OR_UPDATE = &H6Private Const TASK_RUNLEVEL_HIGHEST = &H1Private Const TASK_LOGON_GROUP = &H4Private Const TASK_LOGON_NONE = &H0Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.LoadEnd SubPublic Function CreateOrUpdateTask(ByVal strTaskName As String, ByVal strAuthor As String, ByVal strTaskDescription As String, ByVal strPath As String, ByVal strWorkingDir As String, Optional ByVal strArguments As String = "", Optional ByVal bUseHighestSecLevel As Boolean = True) As LongDim objService As ObjectobjService = CreateObject("Schedule.Service")objService.Connect()Dim objTaskFolder As ObjectobjTaskFolder = objService.GetFolder("\")Dim objTaskDef As ObjectobjTaskDef = objService.NewTask(0)Dim objPrincipal As ObjectobjPrincipal = objTaskDef.principalWith objPrincipal.LogonType = 1.RunLevel = TASK_RUNLEVEL_HIGHESTEnd WithDim colTriggers As ObjectDim objTrigger As ObjectDim colActions As ObjectDim objAction As ObjectDim objInfo As ObjectDim objSettings As ObjectcolTriggers = objTaskDef.TriggersobjTrigger = colTriggers.Create(TASK_TRIGGER_LOGON)objTrigger.Enabled = TruecolActions = objTaskDef.ActionsobjAction = colActions.Create(TASK_ACTION_EXEC)objAction.Path = strPathobjAction.WorkingDirectory = strWorkingDirobjAction.Arguments = strArgumentsobjInfo = objTaskDef.RegistrationInfoobjInfo.Author = strAuthorobjInfo.Description = strTaskDescriptionobjSettings = objTaskDef.SettingsWith objSettings.Enabled = True.Hidden = False.StartWhenAvailable = True.DisallowStartIfOnBatteries = False.StopIfGoingOnBatteries = False.AllowHardTerminate = FalseEnd WithTryIf bUseHighestSecLevel ThenobjTaskFolder.RegisterTaskDefinition(strTaskName, objTaskDef, TASK_CREATE_OR_UPDATE, "Administrators", , TASK_LOGON_GROUP)ElseobjTaskFolder.RegisterTaskDefinition(strTaskName, objTaskDef, TASK_CREATE_OR_UPDATE, , , TASK_LOGON_NONE)End IfCatch ex As ExceptionReturn Err.NumberEnd TryCreateOrUpdateTask = 0objService = NothingobjInfo = NothingobjTaskFolder = NothingobjTaskDef = NothingobjPrincipal = NothingEnd FunctionPublic Function DeleteTask(ByVal strTaskName As String) As LongDim objService As ObjectDim objTaskFolder As ObjectTryobjService = CreateObject("Schedule.Service")objService.Connect()objTaskFolder = objService.GetFolder("\")objTaskFolder.DeleteTask(strTaskName, 0)Catch ex As ExceptionReturn Err.NumberEnd TryobjService = NothingobjTaskFolder = NothingDeleteTask = 0End FunctionPublic Function TaskAvailable(taskName) As BooleanDim service = CreateObject("Schedule.Service")Call service.Connect()' Get the task folder that contains the tasks. Dim rootFolderrootFolder = service.GetFolder("\")Dim taskCollectiontaskCollection = rootFolder.GetTasks(0)Dim numberOfTasksnumberOfTasks = taskCollection.CountIf numberOfTasks = 0 ThenDebug.Print("No tasks are registered.")ElseDebug.Print("Number of tasks registered: " & numberOfTasks)Dim registeredTaskFor Each registeredTask In taskCollectionDim name As String = registeredTask.NameDebug.Print("Task Name: " & name)Dim taskStateSelect Case registeredTask.StateCase "0"taskState = "Unknown"Case "1"taskState = "Disabled"If (name = taskName) ThenTaskAvailable = FalseExit FunctionEnd IfCase "2"taskState = "Queued"Case "3"taskState = "Ready"Case "4"taskState = "Running"Case ElsetaskState = "Unknown"End SelectIf (name = taskName) ThenTaskAvailable = TrueExit FunctionEnd IfDebug.Print("    Task State: " & taskState)NextEnd IfTaskAvailable = FalseEnd FunctionPrivate Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.ClickMsgBox(CreateOrUpdateTask("Test", Interaction.Environ("USERDOMAIN") & "\" & Interaction.Environ("USERNAME"), "a Test Task", Application.ExecutablePath, Application.StartupPath, "", True))End SubPrivate Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.ClickMsgBox(DeleteTask("Test"))End Sub
End Class

转载于:https://www.cnblogs.com/nanfei/p/6100412.html

.net 创建计划任务开机后自动以管理员身份启动运行 win7 ~ win10相关推荐

  1. 一个可以开机后自动和你打招呼的小程序(希望以后可以成为智能的系统)

    这是一个可以开机后自动和你打招呼的小程序,至于你的名字在配置文件中.这里主要是应用了微软的speech技术来播放声音.所以如果你有其他的需求可以自己扩展.这里我只是写了很少的一部分功能,以后有新的想法 ...

  2. Win10休眠模式设置:开机后自动恢复工作界面,防止程序员虐待电脑

    Win10休眠模式设置:开机后自动恢复工作界面,防止程序员虐待电脑 这个功能叫做休眠,与睡眠不同,休眠会在电脑关机之后,将当前工作环境保存为文件,然后在开机之后自动恢复.这个功能对不爱关机的程序员非常 ...

  3. 电脑桌面计算机总是自动打开,电脑开机后自动打开很多软件怎么办

    1. 电脑一开机自动启动好多小程序,如何取消掉 电脑一开机自动启动好多小程序,取消方法如下: 1打开开始菜单,在搜索框输入msconfig ,按回车键, 2在启动栏把不需要启动的程序打勾去掉,点击确定 ...

  4. Linux开机后自动执行命令或脚本

    文章目录 说明 应用场景 涉及文件 步骤 1.添加开机执行指令 2.编写脚本 3.测试效果 自动化编辑工具 脚本 效果 已存在的脚本 不存在的脚本 说明 应用场景 应用场景:开机后自动执行命令或脚本 ...

  5. 设置程序在Windows开机后自动运行的3种方式

    设置程序开机自动运行的方式主要有三种: 一.把快捷方式复制到[开始->所有程序->启动]中.这个得依赖用户的操作. 二.程序添加到Windows开机选项中启动运行. 传送门 设置程序在Wi ...

  6. 解决荣耀8 手机数据连接卡设置开机后自动还原问题。

    症状 卡2为主卡,卡1为上网数据连接专用卡,设置完毕之后重启发现数据连接被更改为卡2了. 有多严重? 造成我得卡2多次欠费,卡2 是3g卡,不能上网,但是是用来接电话的永久卡,如果把主卡设置为卡1,那 ...

  7. 开机后显示服务器正在启动,电脑开机后卡在Windows正在启动界面上怎么办?

    近期有网民电脑开机来到"Windows  已经启动--"界面后就没动了.试着从安全中心进来后改动了许多 设定常见故障依然.对于此状况,华军我下边为大伙儿梳理了实际的解决方案! 流程 ...

  8. 服务器定时任务vbs文件,自动以管理员身份运行批处理bat文件(vbs与bat两种方法)...

    但是,批处理脚本不会默认已管理员身份运行,一般情况下,我会将脚本命名为"XXXXXX(请右键点击,用管理员身份运行!).bat",但总有些用户会忽略这条提示,直接运行,此时由于权限 ...

  9. vbs服务器bat文件,自动以管理员身份运行批处理bat文件(vbs与bat两种方法)

    但是,批处理脚本不会默认已管理员身份运行,一般情况下,我会将脚本命名为"XXXXXX(请右键点击,用管理员身份运行!).bat",但总有些用户会忽略这条提示,直接运行,此时由于权限 ...

  10. C# 让程序自动以管理员身份运行

    VISTA Windows 7 都使用了UAC来控制程序访问,对于一些需要使用管理员身份运行的程序就得右键以管理员身份运行. C# 编程中可以使程序自动使用管理员身份运行,也就是我们常常看到一些程序的 ...

最新文章

  1. BZOJ 4152: [AMPPZ2014]The Captain(最短路)
  2. .NET 的一点历史往事:和 Java 的恩怨
  3. Kafka—配置SASL/PLAIN认证客户端及常用操作命令
  4. 【scrapy windows环境下安装遇到的问题】
  5. Linux网络基础番外篇(IP、MAC、TCP)
  6. qt 中获取摄像头视屏并传输
  7. 博客日历的html代码,八种精美的博客日历代码
  8. 如何进入oppo云服务器,OPPO云服务(查找手机)
  9. 第一章 计算流体力学动力学基础知识
  10. Win10怎么安装Apache服务
  11. IC卡和ID卡的区别。
  12. 碰撞触发器Trigger
  13. x64dbg 实现插件Socket反向通信
  14. android m是什么版本号,Android M版本号确定,并不是Android 6.0
  15. matalb读取txt文件以及将数据写入txt文件
  16. 个人投资理财太平亿康的五种方式
  17. alter table新增字段操作究竟有何影响?(上篇)
  18. 如何让网站变成黑白色或者灰色?
  19. 常见的HTTP状态码(1xx-5xx)
  20. angularJS学习小结——filter

热门文章

  1. docker portainer_Docker可视化管理:Portainer中文版
  2. 好看的按钮集合HTML + CSS各种好看按钮组件
  3. mt7620n华硕固件下载_华硕TUFAX3000最新固件9923刺客模式解锁44 AX5400?
  4. 国家开放大学2021春1067知识产权法题目
  5. 区分解析解(analytical solution)与数值解(numerical solution)
  6. 20189217 2018-2019-2 《密码与安全新技术专题》第9周作业
  7. 最小化安装CentOS 7后,图形界面的安装(GNOME、KDE等)
  8. springboot 项目maven 打包错误
  9. python实现mysql的读写分离及负载均衡
  10. script标签的使用,从零开始