Для любых людей 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
Почему вы хотите это знать? – svick
Ну, во-первых, зная, являетесь ли вы администратором, вы можете узнать, можете ли вы * быть подняты. – aboveyou00
@svick: Мне нужно отобразить определенные элементы пользовательского интерфейса, если пользователь является членом группы «Администраторы». – markyd13