Дайте мне знать, если это сработало для кого-то

я есть приложение Windows Form, которое требует разрешения администратора для запуска, чтобы сделать это, я использую этот код:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

Следующим шагом для завершения разработки является то, что это приложение Windows Form запускается после перезапуска Windows, выключения и повторного включения или входа пользователя.

Вот моя проблема, это приложение требует разрешения администратора и запуска после запуска системы, но я не знаю, как это сделать.

что я сделал

Поместите исполняемый путь приложения в regedit

Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);

Я создал проект Windows Services

https://docs.microsoft.com/en-us/dotnet/framework/windows-services/walkthrough-creating-a-windows-service-application-in-the-component-designer

Эти опции не работают, может кто-нибудь мне помочь?

Спасибо.

 Rondinelli Morais27 дек. 2017 г., 20:30
@ В первой опции «Поместить путь к исполняемому файлу приложения в regedit» ничего не происходит, система не может запустить приложение, ничего не отображается.
 Rondinelli Morais27 дек. 2017 г., 20:32
@ Включите второй вариант «Я создал проект служб Windows», поскольку службы не имеют графического интерфейса и вообще не взаимодействуют с пользователем.
 Ken White27 дек. 2017 г., 14:48
Почему вы используете приложение WinForms для службы Windows? Сервисы не имеют графического интерфейса и вообще не взаимодействуют с пользователем. Они управляются через панель управления или из командной строки с помощью sc.exe.
 Hans Passant27 дек. 2017 г., 15:19
Вы не можете иметь приглашение программы для повышения UAC при запуске. Это намеренно отключено в ОС, пользователь не может достоверно сказать, на что он дает согласие. Подумайте о создании небольшой программы, которая не требует повышения прав, просто попросите пользователя нажать кнопку. Обработчик события Whose Click запускает реальную программу. Убедитесь, что ваш деинсталлятор безупречен. Избегайте того, чтобы это была самая популярная особенность вашего продукта, разделив работу. Сервис, который выполняет повышенные функции, отдельный графический интерфейс, который показывает, что происходит.
 Steve27 дек. 2017 г., 14:45
Эти опции не работают возможно, вам следует объяснить, какие у вас проблемы с этими опциями

Ответы на вопрос(1)

Решение Вопроса

ске.

В основном я только что создал задачу с уровнем запускаСамый высокий и ваш триггер находится на входе в систему.

Я нашел код вВ.Б в этом хранилище:https://bitbucket.org/trparky/start_program_at_startup_without_uac

Sub addTask(taskName As String, taskDescription As String, taskEXEPath As String, taskParameters As String)
        taskName = taskName.Trim
        taskDescription = taskDescription.Trim
        taskEXEPath = taskEXEPath.Trim
        taskParameters = taskParameters.Trim

        If Not IO.File.Exists(taskEXEPath) Then
            MsgBox("Executable path not found.", MsgBoxStyle.Critical, Me.Text)
            Exit Sub
        End If

        Dim taskService As TaskService = New TaskService()
        Dim newTask As TaskDefinition = taskService.NewTask

        newTask.RegistrationInfo.Description = taskDescription

        If chkEnabled.Checked Then newTask.Triggers.Add(New LogonTrigger)

        Dim exeFileInfo As New FileInfo(taskEXEPath)

        newTask.Actions.Add(New ExecAction(Chr(34) & taskEXEPath & Chr(34), taskParameters, exeFileInfo.DirectoryName))

        newTask.Principal.RunLevel = TaskRunLevel.Highest
        newTask.Settings.Compatibility = TaskCompatibility.V2_1
        newTask.Settings.AllowDemandStart = True
        newTask.Settings.DisallowStartIfOnBatteries = False
        newTask.Settings.RunOnlyIfIdle = False
        newTask.Settings.StopIfGoingOnBatteries = False
        newTask.Settings.AllowHardTerminate = False
        newTask.Settings.UseUnifiedSchedulingEngine = True
        newTask.Settings.ExecutionTimeLimit = Nothing
        newTask.Settings.Priority = ProcessPriorityClass.Normal
        newTask.Principal.LogonType = TaskLogonType.InteractiveToken

        taskService.RootFolder.SubFolders(strTaskFolderName).RegisterTaskDefinition(taskName, newTask)

        newTask.Dispose()
        taskService.Dispose()
        newTask = Nothing
        taskService = Nothing
    End Sub

Поэтому все, что я сделал, это перевел этот код на c # и сделал тесты

using Microsoft.Win32.TaskScheduler;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CreateTaskTest
{
    class Program
    {
        static void Main(string[] args)
        {
            addTask();
            //deleteTask();
        }

        static void addTask()
        {
            // Get the service on the local machine
            using (TaskService ts = new TaskService())
            {
                // Create a new task definition and assign properties
                TaskDefinition newTask = ts.NewTask();
                newTask.RegistrationInfo.Description = "Rondinelli Morais Create Task";

                newTask.Triggers.Add(new LogonTrigger());

                newTask.Actions.Add(new ExecAction("C:\\Windows\\regedit.exe"));

                newTask.Principal.RunLevel = TaskRunLevel.Highest;
                newTask.Principal.LogonType = TaskLogonType.InteractiveToken;

                newTask.Settings.Compatibility = TaskCompatibility.V2_1;
                newTask.Settings.AllowDemandStart = true;
                newTask.Settings.DisallowStartIfOnBatteries = false;
                newTask.Settings.RunOnlyIfIdle = false;
                newTask.Settings.StopIfGoingOnBatteries = false;
                newTask.Settings.AllowHardTerminate = false;
                newTask.Settings.UseUnifiedSchedulingEngine = true;
                newTask.Settings.Priority = System.Diagnostics.ProcessPriorityClass.Normal;

                // Register the task in the root folder
                ts.RootFolder.RegisterTaskDefinition(@"Test", newTask);

                newTask.Dispose();
                ts.Dispose();
            }
        }

        static void deleteTask()
        {
            using (TaskService ts = new TaskService())
            {

                var tasks = ts.FindAllTasks(new System.Text.RegularExpressions.Regex(@"Test"));

                foreach(var task in tasks){
                    ts.RootFolder.DeleteTask(task.Name);
                }
            }
        }
    }
}

я используюregedit.exe на пример, потому что эта программа требует разрешения администратора для запуска.

Создайте задачу, выйдите из системы и снова войдите в систему, и вы увидите regedit, открытый после входа в систему.

OBS: чтобы создать или удалить задачу, вы запустили Visual Studio от имени администратора или поместили этот код в процесс установки вашей программы.

Дайте мне знать, если это сработало для кого-то

Ваш ответ на вопрос