Как заставить мою программу C # Winforms запускаться от имени администратора на любом компьютере? - PullRequest
29 голосов
/ 30 августа 2010

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

Мне нужно решение кода (любой пример кода будет отлично)

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

Ответы [ 4 ]

51 голосов
/ 30 августа 2010

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

<?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>  
12 голосов
/ 30 августа 2010

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

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» позволит ему работать от имени администратора. Вот связанный FAQ

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

2 голосов
/ 26 сентября 2016

Очевидный ответ - добавить файл манифеста в проект 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) сообщает программе, что ей необходим доступ на запись в реестр.

1 голос
/ 30 августа 2010

Требуется файл манифеста.Просто поместите файл манифеста и выберите AsInvoker или AsAdministrator.

Если вы можете получить доступ к процессу, вы можете использовать proc.Verb = "runas";

Проверьте это: http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/db6647a3-85ca-4dc4-b661-fbbd36bd561f

...