След като програмата ми бъде инсталирана на клиентска машина, как да принудя програмата ми да работи като администратор на Windows 7?
Как да принудя моето .NET приложение да работи като администратор?
Отговори (13)
Ще искате да промените манифеста, който се вгражда в програмата. Това работи на Visual Studio 2008 и по-нова версия: Проект + Добавяне на нов елемент, изберете „Файл на манифеста на приложението“. Променете елемента <requestedExecutionLevel>
на:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
Потребителят получава подканата UAC, когато стартира програмата. Използвайте разумно; търпението им може да се изчерпи бързо.
Добавянето на елемент requestedExecutionLevel
към вашия манифест е само половината от битката; трябва да запомните, че UAC може да бъде изключен. Ако е така, трябва да извършите проверката по старата школа и да поставите диалогов прозорец за грешка, ако потребителят не е администратор
(извикайте IsInRole(WindowsBuiltInRole.Administrator)
във вашата нишка CurrentPrincipal
).
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
- person Mark Kram; 14.08.2011
IsInRole
, говори Андерс.
- person Uwe Keim; 16.06.2015
Подробните стъпки са както следва.
- Добавете файл с манифест на приложението към проекта
- Променете настройката на приложението на app.manifest
- Актуализирайте етикета на requestedExecutionLevel до requireAdministrator.
Обърнете внимание, че с помощта на този код трябва да изключите настройките за сигурност на ClickOnce, за да направите това, влезте в Properties -› Security -› ClickOnce Security
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;
}
Можете да вградите файл с манифест в EXE файла, което ще накара Windows (7 или по-нова версия) винаги да стартира програмата като администратор.
Можете да намерите повече подробности в Стъпка 6: Създаване и вграждане на манифест на приложение ( UAC) (MSDN).
Докато работите с 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" />
За да настроите приложението си да работи като администратор, трябва да изберете средния.
Друг начин да направите това, само в код, е да откриете дали процесът се изпълнява като администратор, както в отговора от @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);
}
runas
като администратор от потребител, който не е администратор, в противен случай то ще се отвори безшумно с текущи потребителски разрешения (проверено на Windows 7 64 бита). Доколкото мога да разбера, единственото нещо, което можете да направите с деактивиран UAC и липсва администраторско право, е да спрете изпълнението в подходящ момент.
- person reallynice; 09.08.2019
Според
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
ще искате да добавите манифест на приложение, ако все още нямате такъв или не знаете как да го добавите. Тъй като някои проекти не добавят автоматично отделен файл с манифест, първо отидете на свойствата на проекта, отворете раздела Приложение и проверете дали вашият проект не изключва манифеста в долната част на докосването.
- След това щракнете с десния бутон върху проекта
- Добавете нов артикул
- Последно намерете и щракнете върху Файл с манифест на приложението
В Visual Studio 2010 щракнете с десния бутон върху името на вашия проект. Натиснете „Преглед на настройките на Windows“, това генерира и отваря файл, наречен „app.manifest“. В този файл заменете „asInvoker“ с „requireAdministrator“, както е обяснено в коментираните секции във файла.
Можете да създадете манифеста с помощта на настройките за сигурност на 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" />
Това ще накара програмата да изисква администраторски права.
ТОВА НЕ ПРИНУЖДАВА ПРИЛОЖЕНИЕТО ДА РАБОТИ КАТО АДМИНИСТРАТОР.
Това е опростена версия на този отговор, по-горе от @NG
public bool IsUserAdministrator()
{
try
{
WindowsIdentity user = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(user);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
catch
{
return false;
}
}
В случай, че искате решение само с код по някаква причина, просто извикайте 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); }
}
Щракнете с десния бутон върху вашия изпълним файл, отидете на Properties > Compatibility и поставете отметка в квадратчето „Run this program as admin“.
Ако искате да го стартирате като администратор за всички потребители, направете същото в „промяна на настройките за всички потребители“.