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