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

След като програмата ми бъде инсталирана на клиентска машина, как да принудя програмата ми да работи като администратор на Windows 7?


person Gold    schedule 12.05.2010    source източник
comment
Освен написаното от Binary Worrier, може да искате да напишете някакъв код, за да проверите дали имате администраторски привилегии .. (това ли искате?)   -  person lexu    schedule 12.05.2010
comment
Не бих приел леко тази задача, трябва да проверите за какво всъщност се нуждае от администратор и да видите дали можете да я заобиколите. Никой клиент няма да е доволен, че работи с приложение в администраторски режим през цялото време. Много по-големи клиенти дори няма да обмислят приложение като това и ако тестването на лого има значение за вас, то няма да мине така.   -  person Alex    schedule 12.05.2010
comment
Алекс е много на място. Ако е възможно, повишавайте само когато е необходимо, в противен случай груповата политика, UAC и редица други променливи влизат в действие. Най-малкото, с UAC, потребителят ще трябва да упълномощава при всяко изпълнение, а не само когато се извършва конкретно потребителско действие.   -  person Anthony Mason    schedule 11.11.2016
comment
Правилният начин е да вградите манифестен файл във вашето приложение.   -  person Elmue    schedule 03.10.2019


Отговори (13)


Ще искате да промените манифеста, който се вгражда в програмата. Това работи на Visual Studio 2008 и по-нова версия: Проект + Добавяне на нов елемент, изберете „Файл на манифеста на приложението“. Променете елемента <requestedExecutionLevel> на:

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

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

person Hans Passant    schedule 12.05.2010
comment
Ако получите грешка ClickOnce, когато се опитвате да компилирате, вижте този отговор: stackoverflow.com/questions/11023998/ - person SSS; 02.12.2013
comment
Вашият проект трябва да бъде настроен да използва и манифеста на приложението - в Свойствата на проекта проверете раздела Приложение и се уверете, че Манифестът: под „Ресурси“ е зададен на вашия app.manifest (или както сте нарекли .manifest файла). - person Victor Chelaru; 12.04.2016
comment
Трябваше да презаредя проекта, преди VS да ме подкани да рестартирам в администраторски режим. - person Jon; 28.02.2017
comment
Имайте предвид, че това няма да принуди програмата да работи като администратор. UAC може да бъде деактивиран. Всъщност нищо не може да принуди програма под определен потребителски акаунт. - person Alejandro; 03.04.2018
comment
@Alejandro - Да, UAC може да бъде деактивиран, но когато това е така, приложението ще се стартира автоматично като администратор (ако приемем, че вашият потребител има администраторски права), тъй като деактивирането на UAC означава, че всичко работи с най-високата привилегия, разрешена на потребителя. Това е нещо като да се оплаквате, че ако инсталирате елегантна брава на вратата, тя няма да работи, ако вратата бъде премахната. - person Erik Funkenbusch; 05.05.2018
comment
@ErikFunkenbusch Няма да се стартира автоматично като администратор, ще се изпълнява под нормалните разрешения на потребителя (admin, ако потребителят е администратор, или стандартен, ако потребителят е стандартен). Разчитането на този конкретен случай, дори и да е по подразбиране, е това, което добрите програми ще избягват като чума. Следвайки вашата аналогия, фантастичната брава е хубава и всичко останало, но правилно проектираният софтуер трябва да предвиди случая, когато цялата врата бъде премахната, дори и това да е рядко явление. - person Alejandro; 05.05.2018
comment
Отговорът на @SSS вече не работи за VS 2017. ClickOnce винаги се проверява при публикуване и резултатът е невъзможен за публикуване. - person vee; 22.01.2019
comment
За френскоговорящите разработчици опцията е Fichier manifeste de l'application - person peter.cyc; 30.07.2020

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

person Anders    schedule 13.05.2010
comment
Можете също така да използвате <requestedExecutionLevel level="highestAvailable" uiAccess="false" /> - person Mark Kram; 14.08.2011
comment
@MarkKram: Какво общо има highAvailable с това? Въпросът е за принудително налагане на администратор, highAvailable е по-малко ограничителен от requireAdministrator и ще позволи на потребител без администратор да стартира приложението без повишени права без UAC подкана, само администраторите ще получат подкана... - person Anders; 17.09.2013
comment
Ето един MSDN пример за IsInRole , говори Андерс. - person Uwe Keim; 16.06.2015
comment
Вече не помня точните подробности, но мисля, че това зависи от това какво имате предвид под деактивиран. Поставянето на UAC плъзгача до дъното не е същото като деактивирането на UAC (освен при Vista). Ако UAC е напълно деактивиран, целият механизъм за ниво на интегритет е деактивиран и е налична само класическата функция runas.exe от 2000/XP. Проверката на ролята на администратор обработва случая runas.exe. - person Anders; 20.08.2019
comment
Изглежда, че потребителят или трябва да е администратор, който е бил понижен след деактивиране на UAC (чрез UAC плъзгача или регистъра), или обикновен потребител, който е изпълнил regedit, използвайки идентификационни данни на администратор, за да зададе EnableLUA на 0 (обикновен потребител не може да плъзга UAC Плъзнете докрай надолу, дори и с помощта на администратор), за да изпълните exe, който указва level=requireAdministrator без подкана - person Tal Aloni; 21.08.2019
comment
Зададох EnableLUA на 0 на Server 2008 R2 и се премахнах от групата на администраторите, рестартирах и сега exe, който указва level=requireAdministrator, се изпълнява без подкана - person Tal Aloni; 21.08.2019

Подробните стъпки са както следва.

  1. Добавете файл с манифест на приложението към проекта
  2. Променете настройката на приложението на app.manifest
  3. Актуализирайте етикета на requestedExecutionLevel до requireAdministrator.

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

Изберете файл с манифест на приложението

Изберете опция за манифест

Актуализиране на файла на манифеста

Обърнете внимание, че с помощта на този код трябва да изключите настройките за сигурност на ClickOnce, за да направите това, влезте в Properties -› Security -› ClickOnce Security

person Hassan Rahman    schedule 12.05.2017
comment
New Item... не е опция в моя проект за инсталационна услуга. Как да добавя манифеста на приложението? Мога да го добавя към основния си проект, но не и неговия инсталатор. - person HackSlash; 26.03.2020

Приложих някакъв код, за да го направя ръчно:

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;
}
person NG.    schedule 30.08.2013
comment
Това открива само ако контекстът се изпълнява като администратор, не принуждава приложението да работи като администратор, както се изисква от OP - person Matt Wilko; 05.12.2013
comment
Не мисля, че има някакъв програмен начин да принудите приложение да повиши собствените си перми. Ако имаше, това щеше да е голям риск за сигурността, нали? - person Mark Richman; 18.08.2014
comment
Въпреки че вашето решение е добро, но въпросът беше различен. ;) - person Yash; 25.07.2015
comment
вижте преработена версия на този метод тук stackoverflow.com/a/50186997 (субективно) - person Hakan Fıstık; 03.12.2018
comment
Това не отговаря на въпроса! - person Elmue; 03.10.2019

Можете да вградите файл с манифест в EXE файла, което ще накара Windows (7 или по-нова версия) винаги да стартира програмата като администратор.

Можете да намерите повече подробности в Стъпка 6: Създаване и вграждане на манифест на приложение ( UAC) (MSDN).

person David    schedule 12.05.2010

Докато работите с Visual Studio 2008, щракнете с десния бутон върху Project -> Add New Item и след това изберете Application Manifest File.

Във файла на манифеста ще намерите маркера requestedExecutionLevel и можете да зададете нивото на три стойности:

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

OR

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

OR

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

За да настроите приложението си да работи като администратор, трябва да изберете средния.

person Rashad Maqsood    schedule 06.03.2013
comment
Това работи. Въпреки това, той направи празен cmd прозорец да се появи при стартиране на CMD приложението (използване на c# cmd приложение за изпълнение на някои exe във фонов режим). - person W.M.; 18.10.2017

Друг начин да направите това, само в код, е да откриете дали процесът се изпълнява като администратор, както в отговора от @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);
}
person TheLethalCoder    schedule 12.01.2017
comment
+1 за подход само с код. Обърнете внимание, че трябва да активирате UAC, за да имате възможност да стартирате нещо с runas като администратор от потребител, който не е администратор, в противен случай то ще се отвори безшумно с текущи потребителски разрешения (проверено на Windows 7 64 бита). Доколкото мога да разбера, единственото нещо, което можете да направите с деактивиран UAC и липсва администраторско право, е да спрете изпълнението в подходящ момент. - person reallynice; 09.08.2019

Според

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

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

  • След това щракнете с десния бутон върху проекта
  • Добавете нов артикул
  • Последно намерете и щракнете върху Файл с манифест на приложението
person Justin Mcconnell    schedule 17.03.2013

В Visual Studio 2010 щракнете с десния бутон върху името на вашия проект. Натиснете „Преглед на настройките на Windows“, това генерира и отваря файл, наречен „app.manifest“. В този файл заменете „asInvoker“ с „requireAdministrator“, както е обяснено в коментираните секции във файла.

person Evolved    schedule 07.09.2011
comment
Този отговор е за VB.NET :-), а не за VS 2010 като цяло. Отговорите за Добавяне на нов елемент са за C#. В C++ можете да го направите в настройките на проекта. - person Philm; 09.08.2013

Можете да създадете манифеста с помощта на настройките за сигурност на ClickOnce и след това да го деактивирате:

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

След като щракнете върху него, в папката със свойства на проекта ще бъде създаден файл, наречен app.manifest след като това бъде създадено, можете да премахнете отметката от опцията Enable ClickOnce Security Settings

Отворете този файл и променете този ред:

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

to:

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

Това ще накара програмата да изисква администраторски права.

person Yochai Timmer    schedule 14.02.2018

ТОВА НЕ ПРИНУЖДАВА ПРИЛОЖЕНИЕТО ДА РАБОТИ КАТО АДМИНИСТРАТОР.
Това е опростена версия на този отговор, по-горе от @NG

public bool IsUserAdministrator()
{
    try
    {
        WindowsIdentity user = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(user);
        return principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
    catch
    {
        return false;
    }
}
person Hakan Fıstık    schedule 05.05.2018
comment
Това не отговаря на въпроса! - person Elmue; 03.10.2019
comment
@Elmue по-логично е да добавите вашия коментар към оригиналния отговор, който току-що преработих, можете да намерите връзка към този отговор в моя. - person Hakan Fıstık; 03.10.2019

В случай, че искате решение само с код по някаква причина, просто извикайте AdminRelauncher.RelaunchIfNotAdmin() при стартиране:

using System;
using System.Diagnostics;
using System.Reflection;
using System.Security.Principal;

public static class AdminRelauncher
{
    public static void RelaunchIfNotAdmin()
    {
        if (!RunningAsAdmin())
        {
            Console.WriteLine("Running as admin required!");
            ProcessStartInfo proc = new ProcessStartInfo();
            proc.UseShellExecute = true;
            proc.WorkingDirectory = Environment.CurrentDirectory;
            proc.FileName = Assembly.GetEntryAssembly().CodeBase;
            proc.Verb = "runas";
            try
            {
                Process.Start(proc);
                Environment.Exit(0);
            }
            catch (Exception ex)
            {
                Console.WriteLine("This program must be run as an administrator! \n\n" + ex.ToString());
                Environment.Exit(0);
            }
        }
    }

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

        return principal.IsInRole(WindowsBuiltInRole.Administrator);              }
    }
person Gaspa79    schedule 04.03.2021

Щракнете с десния бутон върху вашия изпълним файл, отидете на Properties > Compatibility и поставете отметка в квадратчето „Run this program as admin“.

Ако искате да го стартирате като администратор за всички потребители, направете същото в „промяна на настройките за всички потребители“.

person SlickJayD    schedule 27.03.2014
comment
Това не отговаря на въпроса. След като моята програма е инсталирана на клиентска машина, не как да го направя. - person Joe; 27.03.2014
comment
Извинете за неяснотата. След като вашата програма е инсталирана, променете тази настройка в свойствата на вашия изпълним файл (вашата основна програма, не инсталатора). Той наистина иска да накара програмата му да работи като администратор. - person SlickJayD; 27.03.2014
comment
По-добре е да зададете изискването за администратор в манифеста. Бих казал, че отговаря на въпроса, но едва ли. - person BradleyDotNET; 02.09.2014
comment
@Joe За да бъдем честни, приетият отговор не отговаря на въпроса за OPs, тъй като изисква да инсталирате отново приложението exe. Това едва ли е решение за След като програмата ми бъде инсталирана. Ако нещо друго, този отрицателен отговор е по-правилен от приетия отговор, така че не разбирам защо този отговор има 400+ гласа. - person NickG; 07.11.2014
comment
Всъщност отговаря перфектно и на двата въпроса. Няма голям шанс за промяна на манифеста, след като бъде инсталиран, и програмите не трябва да се опитват да повишават разрешенията си, след като се стартират - в много среди - това е добър път да бъдат наречени злонамерен софтуер. В повечето компании - този отговор е най-добрият, защото поставя тежестта върху потребителя и неговите разрешения. Пиша много код, който не мога нито да видя, нито да стартирам, след като е в производство. Опитайте се да не сте по-умни от собствените си опасения за сигурност. - person jinzai; 20.12.2017