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