Как проверить права администратора 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 только для процесса, запущенного администратором с повышенными правами (запуск от имени администратора).

Другие вопросы по тегам