Как определить, является ли пользователь администратором, даже если он не повышен

в моем приложении c# мне нужно проверить, является ли текущий пользователь членом группы администраторов. Он должен быть совместим как с Windows XP, так и с Windows 7.

В настоящее время я использую следующий код:

bool IsAdministrator
{
    get
    {
        WindowsIdentity identity = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(identity);

        return principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
}

проблема в том, что этот метод возвращает false, если приложение запускается в Windows 7 с включенным UAC как администратор без повышенных прав. Как определить, является ли пользователь администратором, даже если приложение выполняется как не повышенное Администратор?

4 ответов


существует Win32 API GetTokenInformation Что можно использовать для проверки текущего маркера. Если возвращаемый маркер является разделенным, это, вероятно, пользователь-администратор, работающий в режиме без повышенных прав.

GetTokenInformation имеет выходной параметр tokenInformation, который принимает одно из трех значений:

  • TokenElevationTypeDefault = 1
  • TokenElevationTypeFull = 2
  • TokenElevationTypeLimited = 3

значение TokenElevantionTypeLimited указывает, что пользователь работает с разделенным токеном с ограниченными правами. При повышении возвращается значение TokenElevationTypeFull. Пользователь-не администратор имеет значение TokenElevationTypeDefault.

существует полный пример кода для C# at http://www.davidmoore.info/2011/06/20/how-to-check-if-the-current-user-is-an-administrator-even-if-uac-is-on/


для любого VB.NET люди (я знаю, что вы там ...), вот версия, которую я состряпал из разных источников и, я думаю, оптимизирован, чтобы определить, является ли текущий пользователь (в том числе с повышенными правами) в определенной группе администраторов, машине или домене, с или без UAC включен. (много кредита для других сообщений здесь и в других местах для этого!)

во-первых, он использует статическое нулевое логическое значение для сохранения статуса администратора, потому что, хотя основное проверка быстрая, полный тест может занять десятки секунд, поэтому вы хотите сделать это только один раз - если вообще, если вы можете помочь.

во-вторых, он ошибается на стороне основного теста, являющегося неправильным / ложным, что обычно имеет место, если пользователь администрируется AD или если локальный компьютер включен UAC. Так что если это can решите, что пользователь является администратором, это будет.

в-третьих, вы можете добавить или удалить критерии из AuthorizationGroups as вы считаете нужным, но те, что охватывают большинство ситуаций.

наконец, если что-то пойдет не так, вы получите False; Если вам нужна ошибка, вы можете ее иметь, но лично я не вижу смысла.

Function IsAdministrator() As Boolean

    Static bResult As Boolean? = Nothing
    Try
        If bResult Is Nothing Then
            bResult = New WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator)
            If Not bResult Then
                Dim oContext As PrincipalContext = Nothing
                Try 'to get a domain context first ...
                    Domain.GetComputerDomain()
                    oContext = New PrincipalContext(ContextType.Domain)
                Catch
                    '... if it fails, fall through to a machine context
                End Try
                If oContext Is Nothing Then oContext = New PrincipalContext(ContextType.Machine)
                Dim oPrincipal As UserPrincipal = UserPrincipal.FindByIdentity(oContext, WindowsIdentity.GetCurrent().Name)
                If oPrincipal IsNot Nothing Then
                    bResult = oPrincipal.GetAuthorizationGroups().Any(Function(p) _
                        p.Sid.IsWellKnown(WellKnownSidType.BuiltinAdministratorsSid) OrElse
                        p.Sid.IsWellKnown(WellKnownSidType.AccountDomainAdminsSid) OrElse
                        p.Sid.IsWellKnown(WellKnownSidType.AccountAdministratorSid) OrElse
                        p.Sid.IsWellKnown(WellKnownSidType.AccountEnterpriseAdminsSid))
                End If
            End If
        End If
    Catch
        bResult = False
    End Try
    Return bResult.GetValueOrDefault(False)
End Function

Я знаю, что это старый, но я нашел ниже способ хорошо работать во всех системах. Мне нужно было, чтобы он работал на .net 2 и других решениях, таких как WinAPI и объекты управления, не удалось в некоторых версиях Windows:

запустите новый процесс с командой net localgroup administrators и проанализируйте вывод соответствующим образом. Это работает как с включенным, так и с отключенным UAC и не требует повышенного процесса.


Если вы администратор, вы можете временно отключить UAC из кода, а затем снова включить его. Раздел реестра

ключ: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\политики\система Значение: EnableLUA Значение: 0 для отключения, 1 для включения

таким образом, вы можете сделать что-то вроде

RegistryKey myKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System", true);
myKey.SetValue("EnableLUA", "1", RegistryValueKind.String);

затем проверьте своего принципала.. Это своего рода халтура, но ее стоит попробовать.