Права администратора C # - проверка

Знаю, что есть и похожие вопросы. Но хочу проверить только ОДНО.

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


person Hooch    schedule 10.05.2011    source источник
comment
возможный дубликат Как узнать, что мой процесс работает как администратор?   -  person Alex K.    schedule 10.05.2011
comment
Я только что погуглил этот вопрос и, похоже, задал его 3 года назад. Хорошо знать. Спасибо, Google.   -  person Hooch    schedule 22.04.2015


Ответы (2)


Это вернет допустимое значение bool.

using System.Security.Principal;

bool isElevated;
using (WindowsIdentity identity = WindowsIdentity.GetCurrent())
{
    WindowsPrincipal principal = new WindowsPrincipal(identity);
    isElevated = principal.IsInRole(WindowsBuiltInRole.Administrator);
}
person atrljoe    schedule 10.05.2011
comment
+1 потому что это работает даже в Linux (Mono). Выдает истину при запуске от имени root / через sudo. Дает false как пользователь по умолчанию. - person Niklas S.; 20.12.2015
comment
При сборке для .NET 5.0 вы получите ошибку CA1416: этот сайт вызова доступен на всех платформах. WindowsBuiltInRole.Administrator поддерживается только в Windows. - person Jamie; 14.05.2021

Вот ответ @atrljoe превратился в однострочник с использованием последней версии C #:

using System.Security.Principal;

static bool IsElevated => new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator);
person Bryan Legend    schedule 12.11.2015
comment
Это уродливо. Мне жаль. Но на самом деле вам следует все сократить. Лучше оставить его в виде 4-х линий и заставить его функционировать. Как хотя бы отладить ваш однострочник? - person Hooch; 14.11.2015
comment
Я считаю, что лаконичность - это витие, пока она ясна. - person Bryan Legend; 15.11.2015
comment
Интересно ... Мне это легче читать, чем расширенную версию. У этого есть четкая иерархия вызовов, тогда как для понимания кода, разбитого на разные переменные, мне нужно мысленно выполнить его. - person bart; 06.12.2015
comment
Еще одним недостатком этой формы является то, что вы никогда не звоните Dispose по мере необходимости. по контракту делать - person Ian Boyd; 01.05.2017
comment
Мой голос против, потому что он не утилизируется, как сказал Ян. - person Derreck Dean; 30.05.2018
comment
Мало того, что он уродлив, непонятно, что он делает. Я говорю ясно и кратко, даже если для этого потребуется больше строк кода. - person Mmm; 10.01.2021
comment
Этот точный код был бы в десять раз более читабельным, если бы он был просто многострочным. Комментарии не допускают форматирования, но если вы вставите возврат каретки непосредственно после оператора = ›и после вызова конструктора Windows Principle, читаемость будет намного лучше. Однако это неактуально, потому что вам действительно нужно избавиться от этого WindowsIdentity. - person Jamie; 14.05.2021