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




сборки многофайловые (11)

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

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

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


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

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

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


Во время работы над 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" />

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


Согласно

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

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

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

Вы можете создать манифест с помощью параметров безопасности 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" />

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


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

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

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

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


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



это упрощенная версия этого answer

public bool IsUserAdministrator()
{
    try
    {
        WindowsIdentity user = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(user);
        return principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
    catch (Exception)
    {
        return false;
    }
}

Это не прямой ответ, а скорее философское рассуждение о проблеме с точки зрения квази-науки.

Я бы сказал, что в вопросе не указывается единица или культура, в которой можно измерить возраст, большинство ответов, по-видимому, предполагают целочисленное годовое представление. Единица SI для времени - secondэто правильный правильный ответ (конечно, предполагая нормализованное DateTimeи не учитывающее релятивистских эффектов):

var lifeInSeconds = (DateTime.Now.Ticks - then.Ticks)/TickFactor;

В христианском способе расчета возраста в годах:

var then = ... // Then, in this case the birthday
var now = DateTime.UtcNow;
int age = now.Year - then.Year;
if (now.AddYears(-age) < then) age--;

В финансовой сфере существует аналогичная проблема при расчете чего-то, часто называемого фракцией дневных графов , которая составляет примерно несколько лет за данный период. И проблема возраста - это проблема времени.

Пример фактического / фактического (считая все дни «правильно»):

DateTime start, end = .... // Whatever, assume start is before end

double startYearContribution = 1 - (double) start.DayOfYear / (double) (DateTime.IsLeapYear(start.Year) ? 366 : 365);
double endYearContribution = (double)end.DayOfYear / (double)(DateTime.IsLeapYear(end.Year) ? 366 : 365);
double middleContribution = (double) (end.Year - start.Year - 1);

double DCF = startYearContribution + endYearContribution + middleContribution;

Другим довольно распространенным способом измерения времени обычно является «сериализация» (чувак, который назвал это соглашение о дате, всерьез должен был быть trippin):

DateTime start, end = .... // Whatever, assume start is before end
int days = (end - start).Days;

Интересно, как долго мы должны идти до того, как релятивистский возраст в считанные секунды станет более полезным, чем приблизительное приближение солнечных циклов на протяжении всей жизни до сих пор :) Или, другими словами, когда нужно указать период или функция, представляющая движение для себя, должна быть действительной :)





c# .net windows-7 administrator elevated-privileges