Подтвердить что ты не робот

Как узнать, работает ли мой процесс в качестве администратора?

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

4b9b3361

Ответ 1

Технически, если вы хотите узнать, является ли член локальной учетной записью администратора, вы можете получить идентификатор безопасности (SID) текущего пользователя через User свойство в WindowsIdentity class, так (статический 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 пользователя, чтобы узнать, является ли этот пользователь членом локальной admin, так:

bool isLocalAdmin = windowsIdentity.Groups.
    Select(g => (SecurityIdentifier) g.Translate(typeof(SecurityIdentifier))).
    Any(s => s == localAdminGroupSid);

Ответ 2

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

using System.Security.Principal;

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

Ответ 3

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

using System.Security.Principal;

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

Ответ 4

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