2010-05-12 2 views
679

Как только моя программа установлена ​​на клиентской машине, как заставить мою программу запускаться как администратор в Windows 7?Как заставить приложение .NET работать под управлением администратора?

+3

Кроме того, что написал Binary Worrier, вы можете написать код, чтобы проверить, если у вас есть права администратора .. (это то, что вы просите?) – lexu

+30

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

+0

Алекс очень в курсе. Если возможно, только при необходимости повышайте, в противном случае вступают в действие групповая политика, UAC и ряд других переменных. По крайней мере, с UAC пользователь должен будет авторизоваться при каждом запуске, а не только при выполнении определенного действия пользователя. –

ответ

907

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

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

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

+26

Если вы попытаетесь скомпилировать ошибку ClickOnce, см. Этот ответ: http://stackoverflow.com/questions/11023998/clickonce-does-not-support-the-request-execution-level-requireadministrator/11036922#11036922 – SSS

+11

Ваш проект также должен быть настроен для использования манифеста приложения - в свойствах проекта, проверьте вкладку «Приложение» и убедитесь, что «Манифест:» в разделе «Ресурсы» установлен в ваш app.manifest (или что вы назвали. файл манифеста) –

+0

Это не сработает, если вы используете clickonce –

39

Вы можете вставить файл манифеста в EXE-файл, который заставит Windows (7 или выше) всегда запускать программу в качестве администратора.

Дополнительную информацию можно получить в Step 6: Create and Embed an Application Manifest (UAC) (MSDN).

130

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

+21

Вы можете также использовать '' а –

+12

@MarkKram: Что highestAvailable нужно сделать с этим? Вопрос заключается в том, чтобы заставить администратора, upperAvailable менее ограничительный, чем requireAdministrator, и позволит пользователю без права администратора запускать приложение без повышения без приглашения UAC, только администраторы получат запрос ... – Anders

+3

[Вот пример MSDN для ' IsInRole'] (https://msdn.microsoft.com/en-us/library/system.security.principal.windowsbuiltinrole.aspx), говорит Андерс. –

10

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

+6

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

14

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

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

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

ИЛИ

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

ИЛИ

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

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

+0

Это работает. Однако при запуске приложения CMD появилось пустое CMD-окно (с помощью приложения C# cmd для запуска некоторых exe в фоновом режиме). –

10

По

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

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

  • Затем правый проект нажмите
  • Добавить новый пункт
  • Последних, найти и нажмите Application Manifest File
45

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

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; 
} 
+27

Это только определяет, запущен ли контекст как Admin, он не заставляет приложение запускаться как Admin в соответствии с запросом OP –

+4

. Я не думаю, что есть какой-либо программный способ заставить приложение повысить свои собственные perms. Если бы это было, это было бы вполне угрозой безопасности, нет? –

+4

Хотя ваше решение хорошее, но вопрос был другим. ;) – Yash

-3

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

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

+3

Это не отвечает на вопрос. «Как только моя программа установлена ​​на клиентской машине», а не «как я». – Joe

+0

Извините, что не понимаете. Как только ваша программа установлена, измените этот параметр в свойствах вашего исполняемого файла (ваша основная программа, а не инсталлятор). Он действительно хочет заставить свою программу работать как администратор. – SlickJayD

+2

Лучше установить требование администратора в манифесте. Я бы сказал, что он отвечает на вопрос, но едва ли. – BradleyDotNET

3

Другой способ сделать это, только в коде, - определить, работает ли процесс как администратор, как в the answer by @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); 
} 
26

Подробные инструкции приведены ниже.

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

Adding file in Solution

Select Application Manifest File

Select Manifest option

Update Manifest file

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

1

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

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

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

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

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

к:

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

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

+0

Отличная благодарность @yochai Timmer. –

Смежные вопросы