Подтвердить что ты не робот

Как заставить мою программу С# Winforms запускаться как администратор на любом компьютере?

Как заставить мою программу С# Winforms запускаться как администратор на любом компьютере? и любой вид ОС?

Мне нужно решение для кода (любой пример кода будет превосходным)

Заранее спасибо

4b9b3361

Ответ 1

Вы можете вставить этот манифест в ваше приложение.

<?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>  

Ответ 2

Вот пример кода для запуска вашего приложения в качестве администратора.

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" , чтобы он запускался как администратор. Здесь приведены часто задаваемые вопросы

http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/28f84724-af3e-4fa1-bd86-b0d1499eaefa#x_FAQAnswer91

Ответ 3

Очевидным ответом является добавление файла манифеста в проект С# и добавление следующей строки:

<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) сообщает программе, что ему нужен доступ на запись в реестр.