当系统在没有 UAC 提示的情况下启动时,以管理模式自动启动我的程序

Auto-start my program in administrative mode when system starts up without the UAC prompt

我的问题 :

我制作了一个程序,例如我现在在这个目录下有这个程序:"C:\Program Files (x86)\AppName",现在在程序中我在我的程序目录中保存了一些图像,但是因为它在 C 驱动器,它给了我一个 access denied 错误,现在我让程序总是 运行 在管理模式下并且工作得很好,但我的程序中还有一个自动启动的功能我的程序在系统启动时使用注册表项,但是当 "always run in administrative mode" 为 ON 时,程序将 not 启动,即使注册表中有一个启动项,当"always run in administrative mode"为OFF时,它就会启动。


到目前为止我尝试了什么 :

我尝试制作另一个可执行文件,该文件将在系统启动时启动,然后它将 运行 我的主程序并自行关闭,我知道这会起作用,但现在每次我启动计算机时, 用户访问控制提示甚至问我是否信任这个程序,这不是很人性化。

所以我进行了搜索,发现我可以创建计划任务,但我没有找到很多示例,但我尝试手动创建一个,它确实可以正常工作!

但是这里有一个代码不起作用:

Imports Microsoft.Win32.TaskScheduler

 Using ts As New TaskService("\RemoteServer")
    'Create a new task definition and assign properties
    Dim td As TaskDefinition = ts.NewTask()
    td.RegistrationInfo.Description = "Does something"

    'Create a trigger that will fire the task at this time every other day
    td.Triggers.Add(New DailyTrigger() With {
        Key.DaysInterval = 2
    })

    'Create an action that will launch Notepad whenever the trigger fires
    td.Actions.Add(New ExecAction("notepad.exe", "c:\test.log", Nothing))

    'Register the task in the root folder
    ts.RootFolder.RegisterTaskDefinition("Test", td)
End Using

代码的问题是:

找不到 TaskService 并且没有使用 TaskScheduler 库!


希望有这方面经验的人可以帮助我!

回答你的问题:

要使用该代码,您必须先下载 Managed Task Scheduler Wrapper。然后要使其 运行 具有管理权限,您必须在 TaskDefinition:

上将 RunLevel 设置为 TaskRunLevel.Highest
td.Principal.RunLevel = TaskRunLevel.Highest

但是 就像 你不应该将文件写入程序目录(因为它通常位于在受限制的 %ProgramFiles% 文件夹中)。

而是使用 %ProgramData% directory. You can get the path to it from your code via Environment.GetFolderPath():

Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)

'Example:
Dim ConfigPath As String = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "AppName")
Dim ImagePath As String = Path.Combine(ConfigPath, "MyImage.png")

If Directory.Exists(ConfigPath) = False Then Directory.CreateDirectory(ConfigPath)