Как заставить приложение .NET запускаться от имени администратора?

876

После того, как моя программа установлена ​​на клиентском компьютере, как заставить программу работать в Windows 7 в качестве администратора ?

Золото
источник
3
Помимо того, что написал Binary Worrier, вы можете написать некоторый код, чтобы проверить, есть ли у вас права администратора ... (это то, что вы просите?)
lexu
39
Я бы не стал воспринимать эту задачу легкомысленно, вы должны узнать, для чего на самом деле нужен администратор, и посмотреть, сможете ли вы обойти ее. Никто из клиентов не будет рад запускать приложение в режиме администратора все время. Многие крупные клиенты даже не будут рассматривать такое приложение, и если тестирование логотипа имеет для вас значение, оно не пройдет так.
Алекс
2
Алекс очень в курсе. Если возможно, повышайте уровень только при необходимости, в противном случае в игру вступают групповая политика, UAC и ряд других переменных. По крайней мере, при использовании UAC пользователь должен будет авторизоваться при каждом запуске, а не только при выполнении определенного пользовательского действия.
Энтони Мейсон
Правильный способ - встроить файл манифеста в ваше приложение.
Elmue

Ответы:

1145

Вы захотите изменить манифест, встроенный в программу. Это работает в Visual Studio 2008 и более поздних версиях: Project + Add New Item, выберите «Файл манифеста приложения». Измените <requestedExecutionLevel>элемент на:

 <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

Пользователь получает приглашение UAC при запуске программы. Используйте с умом; их терпение может быстро изнашиваться.

Ганс Пассант
источник
33
Если вы получаете сообщение об ошибке ClickOnce при попытке компиляции, см. Следующий
SSS
17
Ваш проект также должен быть настроен на использование манифеста приложения - в Свойствах проекта откройте вкладку «Приложение» и убедитесь, что для параметра «Манифест:» в разделе «Ресурсы» задан ваш app.manifest (или как вы его назвали. файл манифеста).
Виктор Челару
7
Я должен был перезагрузить проект, прежде чем VS предложит мне перезапустить в режиме администратора.
Джон
3
@Alejandro - Да, UAC можно отключить, но в этом случае приложение автоматически запускается от имени администратора (при условии, что у вашего пользователя есть права администратора), потому что отключение UAC означает, что все выполняется с максимальными привилегиями, которые разрешены пользователю. Это все равно, что жаловаться на то, что, если вы установите необычный замок на дверь, он не будет работать, если дверь снимут.
Эрик Фанкенбуш
4
@ErikFunkenbusch Он не будет «автоматически запускаться от имени администратора», он будет работать с обычными разрешениями пользователя (администратор, если пользователь является администратором, или стандарт, если пользователь является стандартным). Опираясь на этот конкретный случай, даже если он используется по умолчанию, хорошие программы избегают, как чума. Следуя вашей аналогии, причудливый замок хорош и все, но правильно разработанное программное обеспечение должно предвидеть случай, когда вся дверь будет удалена, даже если это редкое явление.
Алехандро
155

Добавление requestedExecutionLevelэлемента в ваш манифест - это только полдела; Вы должны помнить, что UAC можно отключить. Если это так, вы должны выполнить проверку по-старому и вывести диалоговое окно с сообщением об ошибке, если пользователь не является администратором
(вызовите IsInRole(WindowsBuiltInRole.Administrator)вашу ветку CurrentPrincipal).

Андерс
источник
22
Кроме того, можно использовать <requestedExecutionLevel level="highestAvailable" uiAccess="false" /> так же
Отметить Kram
18
@MarkKram: Какое отношение имеет самое высокое? Вопрос заключается в том, чтобы заставить администратора, наибольший доступный менее ограничен, чем requireAdministrator, и он позволяет пользователю без прав администратора запускать приложение без повышенных прав без запроса UAC, только администраторам будет предложено ...
Anders
3
Вот пример MSDNIsInRole , о котором говорит Андерс.
Уве Кейм
Я больше не помню точных деталей, но думаю, это зависит от того, что вы подразумеваете под инвалидом. Поместить ползунок «UAC» полностью вниз - это не то же самое, что отключить UAC (за исключением Vista). Если UAC полностью отключен, весь механизм уровня целостности отключается и доступна только классическая функция runas.exe из 2000 / XP. Проверка роли администратора обрабатывает случай runas.exe.
Андерс
1
Я установил EnableLUA на 0 на Server 2008 R2 и удалил себя из группы администраторов, перезагрузил компьютер, и теперь исполняемый файл, который указывает level = "requireAdministrator", запускается без всякого запроса
Tal
87

Подробные шаги заключаются в следующем.

  1. Добавить файл манифеста приложения в решение
  2. Измените настройки приложения на "app.manifest"
  3. Обновите тег «запрашиваемый уровень выполнения» до requireAdministrator.

Добавление файла в решение

Выберите файл манифеста приложения

Выберите вариант манифеста

Обновить файл манифеста

Обратите внимание, что с помощью этого кода вам необходимо отключить настройки безопасности ClickOnce, для этого перейдите в Свойства -> Безопасность -> Безопасность ClickOnce.

Хасан Рахман
источник
New Item...не вариант в моем проекте службы установки. Как я могу добавить манифест приложения? Я могу добавить его в свой основной проект, но не его установщик.
HackSlash
61

Я реализовал некоторый код, чтобы сделать это вручную:

using System.Security.Principal;
public bool IsUserAdministrator()
{
    bool isAdmin;
    try
    {
        WindowsIdentity user = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(user);
        isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
    catch (UnauthorizedAccessException ex)
    {
        isAdmin = false;
    }
    catch (Exception ex)
    {
        isAdmin = false;
    }
    return isAdmin;
}
NG.
источник
45
Это только обнаруживает, если контекст запущен от имени администратора, это не означает, что приложение запускается от имени администратора, как того требует OP
Мэтт Вилко
5
Я не думаю, что есть какой-то программный способ заставить приложение повысить уровень собственной безопасности. Если бы это было так, это было бы довольно опасно для безопасности, нет?
Марк Ричман
6
Хотя ваше решение хорошо, но вопрос был другим. ;)
Яша
см. переработанную версию этого метода здесь stackoverflow.com/a/50186997 (субъективно)
Hakan Fıstık
Это не отвечает на вопрос!
Elmue
19

Работая над Visual Studio 2008, щелкните правой кнопкой мыши Project -> Add New Itemи выберите Application Manifest File.

В файле манифеста вы найдете тег requestedExecutionLevelи можете установить уровень на три значения:

<requestedExecutionLevel level="asInvoker" uiAccess="false" />

ИЛИ

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

ИЛИ

<requestedExecutionLevel level="highestAvailable" uiAccess="false" />

Чтобы приложение работало от имени администратора, вам нужно выбрать среднее.

Рашад Максуд
источник
Это работает. Однако при запуске приложения CMD появилось пустое окно cmd (с помощью приложения c # cmd для запуска некоторых exe-файлов в фоновом режиме).
WM
13

Согласно

<requestedExecutionLevel level="highestAvailable" uiAccess="false" />

Вы захотите добавить манифест приложения, если у вас его еще нет или вы не знаете, как его добавить. Поскольку некоторые проекты не добавляют автоматически отдельный файл манифеста, сначала перейдите в свойства проекта, перейдите на вкладку « Приложение » и убедитесь, что ваш проект не исключает манифест в нижней части касания.

  • Далее щелкните правой кнопкой мыши проект
  • Добавить новый предмет
  • Наконец, найдите и нажмите Файл манифеста приложения
Джастин макконнелл
источник
12

В Visual Studio 2010 щелкните правой кнопкой мыши имя вашего проекта. Нажмите «View Windows Settings», чтобы создать и открыть файл «app.manifest». В этом файле замените «asInvoker» на «requireAdministrator», как описано в закомментированных разделах файла.

Evolved
источник
6
Этот ответ о VB.NET :-), а не VS 2010 в целом. Ответы «Добавить новый элемент» о C #. В C ++ вы можете сделать это в настройках проекта.
Филм
12

Еще один способ сделать это только в коде - это определить, запущен ли процесс от имени администратора, как в ответе @NG., А затем снова откройте приложение и закройте текущее.

Я использую этот код, когда приложению нужны только права администратора при запуске в определенных условиях, например при установке себя в качестве службы. Так что он не должен запускаться от имени администратора все время, как другие ответы тоже.

Обратите внимание, что в приведенном ниже коде NeedsToRunAsAdminпоказан метод, который определяет, требуются ли в текущих условиях права администратора. Если это вернетсяfalse код не будет повышать себя. Это главное преимущество этого подхода перед другими.

Хотя этот код имеет преимущества, указанные выше, он должен перезапустить себя как новый процесс, который не всегда соответствует желаемому.

private static void Main(string[] args)
{
    if (NeedsToRunAsAdmin() && !IsRunAsAdmin())
    {
        ProcessStartInfo proc = new ProcessStartInfo();
        proc.UseShellExecute = true;
        proc.WorkingDirectory = Environment.CurrentDirectory;
        proc.FileName = Assembly.GetEntryAssembly().CodeBase;

        foreach (string arg in args)
        {
            proc.Arguments += String.Format("\"{0}\" ", arg);
        }

        proc.Verb = "runas";

        try
        {
            Process.Start(proc);
        }
        catch
        {
            Console.WriteLine("This application requires elevated credentials in order to operate correctly!");
        }
    }
    else
    {
        //Normal program logic...
    }
}

private static bool IsRunAsAdmin()
{
    WindowsIdentity id = WindowsIdentity.GetCurrent();
    WindowsPrincipal principal = new WindowsPrincipal(id);

    return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
TheLethalCoder
источник
1
+1 для подхода только с кодом. Обратите внимание, что вам нужно включить UAC, чтобы иметь возможность запускать что-либо с runasправами администратора от пользователя, не являющегося администратором, в противном случае он будет тихо открываться с текущими разрешениями пользователя (проверено в Windows 7 64-битная версия). Насколько я могу сказать, единственное, что вы можете сделать с отключенным UAC и отсутствием прав администратора, - это остановить выполнение в нужный момент.
действительно
9

Вы можете создать манифест с помощью настроек безопасности ClickOnce, а затем отключить его:

Right click on the Project -> Properties -> Security -> Enable ClickOnce Security Settings

После того, как вы щелкнете по нему, файл будет создан в папке свойств проекта с именем app.manifest, как только он будет создан, вы можете снять флажокEnable ClickOnce Security Settings флажок

Откройте этот файл и измените эту строку:

<requestedExecutionLevel level="asInvoker" uiAccess="false" />

чтобы:

 <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />

Это заставит программу требовать прав администратора.

Йохай Тиммер
источник
7

Это упрощенная версия этого ответа , @NG выше

public bool IsUserAdministrator()
{
    try
    {
        WindowsIdentity user = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(user);
        return principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
    catch
    {
        return false;
    }
}
Хакан Фистик
источник
1
Это не отвечает на вопрос!
Elmue
@ Elmue более логично добавить ваш комментарий к первоначальному ответу, который я только что реорганизовал, вы можете найти ссылку на этот ответ в моем.
Хакан Фистик,
-3

Щелкните правой кнопкой мыши по своему исполняемому файлу, выберите «Свойства»> «Совместимость» и установите флажок «Запускать эту программу от имени администратора».

Если вы хотите запустить его как администратор для всех пользователей, сделайте то же самое в «настройке изменений для всех пользователей».

SlickJayD
источник
4
Это не отвечает на вопрос. «Как только моя программа установлена ​​на клиентском компьютере», а не «как мне».
Джо
Извините за то, что неясно. Как только ваша программа установлена, измените этот параметр в свойствах вашего исполняемого файла (ваша основная программа, а не установщик). Он хочет заставить свою программу работать от имени администратора.
SlickJayD
2
Лучше установить требование администратора в манифесте. Я бы сказал, что это отвечает на вопрос, но едва.
BradleyDotNET,
3
@Joe Справедливости ради, принятый ответ не отвечает на вопрос OPs, поскольку требует переустановки exe приложения. Это вряд ли решение для "Как только моя программа установлена". Во всяком случае, этот отрицательный ответ является более правильным, чем принятый ответ, поэтому я не понимаю, почему этот ответ имеет более 400 голосов.
NickG
На самом деле, он отлично отвечает на оба вопроса. Не так много шансов изменить манифест после установки, и программы не должны пытаться повысить свои разрешения при запуске - во многих средах - это хороший путь к тому, чтобы называться вредоносным ПО. В большинстве компаний этот ответ является лучшим, поскольку он ложится бременем на пользователя и его разрешения. Я пишу много кода, который не могу ни «увидеть», ни запустить, когда он запущен. Постарайтесь не быть более умным, чем ваши собственные проблемы безопасности.
Джинзай