2012-04-06 2 views
10

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

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

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

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

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

+3

Почему вы хотите это знать? – svick

+4

Ну, во-первых, зная, являетесь ли вы администратором, вы можете узнать, можете ли вы * быть подняты. – aboveyou00

+0

@svick: Мне нужно отобразить определенные элементы пользовательского интерфейса, если пользователь является членом группы «Администраторы». – markyd13

ответ

17

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

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

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

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

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

+0

Спасибо, это именно то, что я ищу. – markyd13

-4

Если вы являетесь администратором, вы можете временно отключить контроль учетных записей из кода повторно включить его. Ключ реестра

Ключа: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Policies \ System Значения: EnableLUA значения: 0 для отключения, 1 для включения

Так что вы могли бы сделать что-то вроде

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

Затем проверьте свой главный. Это прекрасный хак, но его стоит сделать.

+0

вы хотите попытаться отключить, и если это не сработает, это не так? – NSGaga

+0

Правильно ... Просто мысль ... довольно взломана, хотя .. –

+4

Отключение системы безопасности системы просто для того, чтобы сделать чек, - это не только «прекрасный хак». Это ужасно. Не делай этого. –

0

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

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

+0

работает только для местных администраторов – Tar

1

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

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

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

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

И наконец, если что-то пойдет не так, вы получите 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 
Смежные вопросы