Очевидный ответ - добавить файл манифеста в проект C # и добавить следующую строку:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
Но довольно необычный подход также может быть использован. Мы знаем, что доступ к реестру требует прав администратора. Таким образом, если у вас есть функция, которая содержит права на запись в реестр, она выдаст System.Security.SecurityException
, если вы не запускаете программу от имени администратора. Подразумевается, что вы должны вызывать эту функцию в начале программы. Если выдается это исключение, вы можете сообщить пользователю, чтобы он запускал программу от имени администратора и закрывал ее.
public void enforceAdminPrivilegesWorkaround()
{
RegistryKey rk;
string registryPath = @"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\";
try
{
if(Environment.Is64BitOperatingSystem)
{
rk = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry64);
}
else
{
rk = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry32);
}
rk = rk.OpenSubKey(registryPath, true);
}
catch(System.Security.SecurityException ex)
{
MessageBox.Show("Please run as administrator");
System.Environment.Exit(1);
}
catch(Exception e)
{
MessageBox.Show(e.Message);
}
}
Здесь true
в строке rk = rk.OpenSubKey(registryPath, true)
сообщает программе, что ей необходим доступ на запись в реестр.