Как проверить права администратора C#
Как проверить, запускается ли мое приложение с правами администратора? Я использую этот код сейчас:
public static bool IsUserAdministrator()
{
//bool value to hold our return value
bool isAdmin;
try
{
//get the currently logged in user
WindowsIdentity user = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(user);
isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);
}
catch (UnauthorizedAccessException ex)
{
isAdmin = false;
}
catch (Exception ex)
{
isAdmin = false;
}
return isAdmin;
}
Этот код проверяет права пользователя, мне нужно проверить права, которые имеет приложение. Например, я не администратор, но когда приложение запускается с правами администратора, этот код возвращает false. Спасибо!
1 ответ
Это правильный подход к выполнению проверки, я использую его сам в своем профиле PowerShell, чтобы различать повышенные сеансы.
Я подозреваю, что вы не принимаете во внимание влияние контроля доступа пользователей (UAC). Когда пользователь входит в систему, он получает выделенный объект токена безопасности. Он содержит как их собственный идентификатор безопасности (SID), так и SID групп, к которым они принадлежат, и список привилегий, которые у них есть (и включены ли эти привилегии).
С включенным контролем учетных записей, когда вы выполняете интерактивный вход в систему, если у вас есть определенные привилегии или вы являетесь членом локальных администраторов, вы получаете два токена *: один со всем, а второй с удаленными SID и привилегиями административного доступа. Первый токен используется с каждым запущенным процессом, если он не запущен с повышенными правами при использовании второго токена.
Таким образом, администратор не может использовать свои полномочия без дополнительного шага - это помогает предотвратить запуск вредоносных программ с полным контролем над системой.
Лучший инструмент для просмотра этого в действии - Process Explorer. На вкладке "Безопасность" диалогового окна свойств процесса отображается содержимое маркера безопасности процесса (а добавление столбца "Уровень целостности" на главном экране покажет, какие процессы повышены) - запустите Process Explorer с повышенными правами, чтобы увидеть полную информацию.
Таким образом, ваш код будет возвращать true только для процесса, запущенного администратором с повышенными правами (запуск от имени администратора).