Как я могу определить, запущен ли мой процесс от имени администратора?

StackOverflow https://stackoverflow.com/questions/509292

  •  21-08-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

WindowsIdentity windowsIdentity = WindowsIdentity.GetCurrent();

string sid = windowsIdentity.User.ToString();

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

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

С-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);

Другие советы

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

using System.Security.Principal;

WindowsIdentity identity = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(identity);
bool isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);

Вот один пример, как это сделать.

using System.Security.Principal;

static bool IsElevated => new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator);

Я счел важным отметить трудность, с которой я столкнулся при попытке использовать WellKnownSidType.BuiltinAdministratorsSid в соответствии с ответом касперОна выше.В соответствии с WellKnownSidType MSDN, BuiltinAdministratorsSid "Указывает SID, соответствующий учетной записи администратора ". Поэтому я ожидаю, что код casperOne будет работать, и предполагаю, что это, вероятно, работает в некоторых средах.К сожалению, этого не произошло в моей Windows 2003 с .NET 2.0 (устаревший код).Он фактически вернул S-1-5-32-544, который, согласно эта статья это sid для администраторов Группа.Таким образом, сравнение для меня неудачно.Мне придется провести собственное сравнение строк для startswith "S-1-5-21" (этот kb 243330 указывает, что "21" включено, хотя в блоге, на который ссылается выше, этого нет) и endswith "500".

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top