Вопрос или проблема
Я попробовал этот код, чтобы добавить свою программу в \HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon Userinit для автозапуска на Windows 10. Вот мой код:
using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace TempCode
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
AddToRegedit();
}
void AddToRegedit()
{
string programPath = @"C:\Users\XPS\Videos\TestApp.exe";
RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon", true);
string newValue = @"C:\WINDOWS\system32\userinit.exe," + programPath + ",";
key.SetValue("Userinit", newValue, RegistryValueKind.String);
key.Close();
Console.WriteLine("Программа добавлена!");
}
}
}
Я запустил это с отладкой с правами администратора, но ничего не изменилось. Если у вас есть идеи, что не так, пожалуйста, помогите!
Я попробовал: перезагрузить ОС, запустить программу без отладки и даже спросить у ChatGPT, но ничего не изменилось.
Также если в cmd я пишу REG QUERY HKLM\Software\Microsoft\Windows NT\, то выдает ошибку: Неверный синтаксис. Введите “REG QUERY /?” для справки по использованию. Может, это из-за пробела?
ИЗМЕНЕНИЕ: Я сам исправил проблему, вот код:
void RegeditValueChange()
{
ProcessStartInfo processInfo = new ProcessStartInfo()
{
FileName = "cmd",
Arguments = "/k REG ADD \"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\" /v Userinit /t REG_SZ /d C:\\Path\\To\\Your\\File.exe /reg:64 /f"
// Уберите комментарии, чтобы выполнить команду без окна
//UseShellExecute = false,
//RedirectStandardOutput = true,
//RedirectStandardError = true,
//CreateNoWindow = true
};
using (Process process = Process.Start(processInfo))
{
process.WaitForExit();
// Раскомментируйте это для ведения журнала (если вы выполняете без окна cmd)
/*string output = process.StandardOutput.ReadToEnd();
string error = process.StandardError.ReadToEnd();
if (!string.IsNullOrWhiteSpace(output))
{
Console.WriteLine("Вывод: " + output);
}
if (!string.IsNullOrWhiteSpace(error))
{
Console.WriteLine("Ошибка: " + error);
}*/
}
}
Если вы используете 32-разрядную систему, просто уберите /reg:64. Также не рекомендую использовать пробелы в пути к вашей программе, но если вы это сделали, попробуйте добавить \”\” в начале и в конце вашего пути. /f заставляет программу не спрашивать о замене.
Пожалуйста, не удаляйте этот вопрос, я хочу, чтобы люди могли найти решение, если захотят!
Ответ или решение
Конечно! Ниже приведен полный ответ на ваш вопрос о добавлении программы в автозагрузку через реестр с использованием C# на Windows 10, с учетом вашего первоначального кода и решением проблемы, которое вы нашли.
Ответ:
Для автоматического запуска приложения при входе в систему в Windows 10 обычно используется изменение ключа Userinit
в реестре. Однако, изменения в реестре могут быть затруднительными, если процесс не имеет необходимых привилегий, или если пути указаны неверно.
Исправленный код
Вы правильно отметили, что для выполнения команд с изменениями в реестре лучше использовать командную строку. Вот подходящий метод для добавления пути к вашей программе в реестр.
using System;
using System.Diagnostics;
using System.Windows.Forms;
namespace TempCode
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
RegeditValueChange();
}
void RegeditValueChange()
{
// Укажите путь к вашему приложению
string programPath = @"C:\Path\To\Your\File.exe";
ProcessStartInfo processInfo = new ProcessStartInfo()
{
FileName = "cmd",
Arguments = $"/c REG ADD \"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\" /v Userinit /t REG_SZ /d \"C:\\WINDOWS\\system32\\userinit.exe,{programPath},\" /reg:64 /f",
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
CreateNoWindow = true
};
using (Process process = Process.Start(processInfo))
{
process.WaitForExit();
// Логирование вывода, если требуется
string output = process.StandardOutput.ReadToEnd();
string error = process.StandardError.ReadToEnd();
if (!string.IsNullOrWhiteSpace(output))
{
Console.WriteLine("Output: " + output);
}
if (!string.IsNullOrWhiteSpace(error))
{
Console.WriteLine("Error: " + error);
}
}
}
}
}
Объяснение кода
-
Путь к программе: Обратите внимание, что в строке
programPath
следует указать правильный путь к вашему исполняемому файлу. Убедитесь, что в этом пути нет пробелов или корректно используйте кавычки. -
Использование командной строки: Для изменения значения в реестре вызывается командная строка с помощью
ProcessStartInfo
. Параметры включают:/c
— чтобы выполнить команду и завершить.REG ADD
— для добавления нового значения.- Параметр
/reg:64
используется для 64-битной версии Windows. Если система 32-битная, этот параметр можно опустить.
-
Флаги:
/f
— подавляет запрос на подтверждение перезаписи значения, если оно уже существует.
Важные заметки
- Убедитесь, что программа запускается с правами администратора, иначе возможно, что изменения в реестре не будут применены.
- Будьте аккуратны при редактировании реестра, так как это может повлиять на стабильность системы.
- Рекомендуется создать резервную копию реестра перед внесением изменений.
Используя данный метод, вы сможете успешно добавить ваш файл в автозапуск системы. Если у вас возникнут дополнительные вопросы или трудности, не стесняйтесь задавать их!