Я хотел бы отобразить некоторые дополнительные элементы пользовательского интерфейса, когда процесс запускается в качестве администратора, а не когда он не похож на то, как Visual Studio 2008 отображает «Администратор» в строке заголовка при работе в качестве администратора. Как я могу сказать?Как узнать, работает ли мой процесс как Администратор?
ответ
Технически, если вы хотите, чтобы увидеть, если член является локальным администратором счет, то вы можете получить security identifier (SID) текущего пользователя через User
property на WindowsIdentity
class, как и (статический GetCurrent
method получает текущего пользователя Windows,):
WindowsIdentity windowsIdentity = WindowsIdentity.GetCurrent();
string sid = windowsIdentity.User.ToString();
свойство User
возвращает SID пользователя, который has a number of predefined values for various groups and users.
Тогда вы бы проверить, если the SID has the following pattern, indicating it is the local administrator account (which is a well-known 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);
Howeve r, я подозреваю, что вы действительно хотите знать, является ли текущий пользователь членом администраторов group для локального компьютера. Вы можете получить этот SID с помощью WellKnownSidType
из BuiltinAdministratorsSid
:
// Get the SID of the admin group on the local machine.
var localAdminGroupSid = new SecurityIdentifier(
WellKnownSidType.BuiltinAdministratorsSid, null);
Затем вы можете проверить Groups
property на WindowsIdentity
пользователя, чтобы убедиться, что пользователь является членом локальной администратора группы, например, так:
bool isLocalAdmin = windowsIdentity.Groups.
Select(g => (SecurityIdentifier) g.Translate(typeof(SecurityIdentifier))).
Any(s => s == localAdminGroupSid);
Проверяет ли текущий пользователь права администратора или процесс работает как администратор?Пользователь, который не является администратором, все еще может запускать процесс как администратор, щелкнув правой кнопкой мыши процесс и выбрав «Запуск от имени администратора». –
@JanTacci Если пользователь щелкает правой кнопкой мыши и выбирает запуск как администратор, тогда процесс выполняется как пользователь из группы администраторов, который был выбран из диалогового окна UAC, который показан, процесс не запускается под зарегистрированным пользователем в этом пункте , – casperOne
является администратором и запускает приложение в качестве администратора, это две разные вещи. Даже если я администратор, я все равно могу запустить приложение без привилегий, что в моей ситуации вызывает у меня проблемы. –
Я думаю, что это хороший простой механизм.
using System.Security.Principal;
WindowsIdentity identity = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(identity);
bool isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);
Я чувствовал, что важно отметить трудности, я имел в попытке использовать WellKnownSidType.BuiltinAdministratorsSid в ответ casperOne в выше. Согласно WellKnownSiDType MSDN, BuiltinAdministratorsSid «Указывает SID, который соответствует учетной записи администратора». Поэтому я ожидал бы, что код casperOne будет работать, и предположим, что это может произойти в некоторых средах. К сожалению, это не было на моей Windows 2003 с .NET 2.0 (устаревший код). Он фактически вернул S-1-5-32-544, который, согласно this article, является sid для администраторов group. Таким образом, сравнение не подходит для меня. Мне нужно будет выполнить собственное сравнение строк для startswith «S-1-5-21» (что kb 243330 указывает, что «21» включен, даже если упомянутый выше блог не работает) и заканчивается «500».
Вот один лайнер, чтобы сделать это.
using System.Security.Principal;
static bool IsElevated => new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator);
Ответ на это тот же: http://stackoverflow.com/questions/95912/how-can-i-detect-if-my-process-is-running-uac-elevated-or- не – DSO
Также смотрите здесь http://www.blackwasp.co.uk/CheckAdmin.aspx –