Как я могу узнать, запущен ли мой процесс от имени администратора? - PullRequest
31 голосов
/ 04 февраля 2009

Я хотел бы отобразить некоторые дополнительные элементы пользовательского интерфейса, когда процесс запускается от имени администратора, а не когда это не так, подобно тому, как Visual Studio 2008 отображает «Администратор» в строке заголовка при запуске от имени администратора. Как я могу сказать?

Ответы [ 4 ]

34 голосов
/ 04 февраля 2009

Технически, если вы хотите увидеть, является ли участник локальным администратором учетная запись , то вы можете получить идентификатор безопасности (SID) текущего пользователя через User свойство для WindowsIdentity класса , вот так (статический GetCurrent метод возвращает текущего пользователя Windows):

WindowsIdentity windowsIdentity = WindowsIdentity.GetCurrent();

string sid = windowsIdentity.User.ToString();

Свойство User возвращает SID пользователя, у которого есть ряд предопределенных значений для различных групп и пользователей .

Затем вы должны проверить, имеет ли SID следующий шаблон, указывающий, что это учетная запись локального администратора (которая является известным SID) :

S-1-5- {другие детали SID} -500

Или, если вы не хотите разбирать строки, вы можете использовать класс SecurityIdentifier:

// Get the built-in administrator account.
var sid = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, 
    null);

// Compare to the current user.
bool isBuiltInAdmin = (windowsIdentity.User == sid);

Однако я подозреваю, что вы действительно хотите знать, что текущий пользователь является членом группы администраторов для локального компьютера. Вы можете получить этот SID, используя WellKnownSidType из BuiltinAdministratorsSid:

// Get the SID of the admin group on the local machine.
var localAdminGroupSid = new SecurityIdentifier(
    WellKnownSidType.BuiltinAdministratorsSid, null);

Затем вы можете проверить Groups свойство на WindowsIdentity пользователя, чтобы узнать, является ли этот пользователь членом локальной группы администраторов, например:

bool isLocalAdmin = windowsIdentity.Groups.
    Select(g => (SecurityIdentifier) g.Translate(typeof(SecurityIdentifier))).
    Any(s => s == localAdminGroupSid);
19 голосов
/ 18 мая 2013

Я думаю, что это хороший простой механизм.

using System.Security.Principal;

WindowsIdentity identity = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(identity);
bool isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);
3 голосов
/ 13 ноября 2015

Вот один лайнер, чтобы сделать это.

using System.Security.Principal;

static bool IsElevated => new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator);
0 голосов
/ 14 февраля 2014

Мне показалось важным отметить трудности, с которыми я столкнулся при попытке использовать WellKnownSidType.BuiltinAdministratorsSid в ответе casperOne выше. Согласно WellKnownSiDType MSDN , BuiltinAdministratorsSid «Указывает идентификатор безопасности, соответствующий учетной записи администратора». Так что я ожидаю, что код casperOne будет работать, и думаю, что это возможно в некоторых средах. К сожалению, этого не произошло в моей Windows 2003 с .NET 2.0 (устаревший код). На самом деле он вернул S-1-5-32-544, который, согласно этой статье , является sid для администраторов группы . Таким образом, сравнение не удается для меня. Мне нужно будет выполнить собственное сравнение строк для стартов с "S-1-5-21" (это означает, что 243330 КБ означает, что "21" включен, хотя упомянутый выше блог этого не делает) и заканчивается "500".

...