Как заставить мою программу С# Winforms запускаться как администратор на любом компьютере? и любой вид ОС?
Мне нужно решение для кода (любой пример кода будет превосходным)
Заранее спасибо
Как заставить мою программу С# Winforms запускаться как администратор на любом компьютере? и любой вид ОС?
Мне нужно решение для кода (любой пример кода будет превосходным)
Заранее спасибо
Вы можете вставить этот манифест в ваше приложение.
<?xml version="1.0" encoding="utf-8" ?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<assemblyIdentity version="1.0.0.0" name="MyApplication" />
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
</asmv1:assembly>
Вот пример кода для запуска вашего приложения в качестве администратора.
ProcessStartInfo proc = new ProcessStartInfo();
proc.UseShellExecute = true;
proc.WorkingDirectory = Environment.CurrentDirectory;
proc.FileName = Application.ExecutablePath;
proc.Verb = "runas";
try
{
Process.Start(proc);
}
catch
{
// The user refused the elevation.
// Do nothing and return directly ...
return;
}
Application.Exit(); // Quit itself
Установите ProcessStartInfo.Verb в "runas" , чтобы он запускался как администратор. Здесь приведены часто задаваемые вопросы
Очевидным ответом является добавление файла манифеста в проект С# и добавление следующей строки:
<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)
сообщает программе, что ему нужен доступ на запись в реестр.
Ему нужен файл манифеста. Просто поместите файл манифеста и выберите AsInvoker или AsAdministrator.
Если вы можете получить доступ к процессу, вы можете использовать proc.Verb = "runas";
Проверьте это: http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/db6647a3-85ca-4dc4-b661-fbbd36bd561f