2010-08-30 4 views

ответ

72
using System.Security.Principal; 

public static bool IsAdministrator() 
{ 
    WindowsIdentity identity = WindowsIdentity.GetCurrent(); 
    WindowsPrincipal principal = new WindowsPrincipal(identity); 
    return principal.IsInRole(WindowsBuiltInRole.Administrator); 
} 
+4

Просто обратите внимание, что вышеуказанное не будет работать, если UAC включен в Vista или Win7; вам нужно будет открыть окно подтверждения UAC и в этом случае повысить права доступа. – MisterZimbu

+0

Что о http://ayende.com/blog/158401/are-you-an-administrator или http://blogs.msdn.com/b/jaredpar/archive/2007/08/01/detecting-if-you -are-an-admin.aspx? Что лучше? – Kiquenet

+2

не работает для меня, получая ложный FY.I я администратор –

25
return new WindowsPrincipal(WindowsIdentity.GetCurrent()) 
    .IsInRole(WindowsBuiltInRole.Administrator); 
+2

@ Ниссим: Любая крайность может быть плохой, но нам нужно судить о каждом конкретном случае. –

+32

@Nissm: Вы оба ответили одновременно, или около того, что через 5 минут после того, как вы оба указали, что отправили «5 минут назад». Нет причин для атаки Алекса; мы здесь не для того, чтобы заработать репутацию, мы здесь, чтобы помочь. – Randolpho

+0

Что о http://ayende.com/blog/158401/are-you-an-administrator или http://blogs.msdn.com/b/jaredpar/archive/2007/08/01/detecting-if-you -are-an-admin.aspx? Что лучше? – Kiquenet

2

Просто думал, что я хотел бы добавить еще одно решение; поскольку IsInRole не всегда работает.

  • Если пользователь не является членом указанной группы пользователей Windows в текущем сеансе.
  • Администратор внес изменения в параметры групповой политики
  • Параметр роли рассматривается как метод «Чувствительность к регистру».
  • И если на компьютере с XP нет установленной версии .NET Framework, это не сработает.

В зависимости от ваших потребностей, если вам необходимо поддерживать старые системы; или не уверены в том, как ваш клиент физически управляет вашей системой. Это решение, которое я реализовал; для гибкости и изменений.

class Elevated_Rights 
    { 

     // Token Bool: 
     private bool _level = false; 

     #region Constructor: 

     protected Elevated_Rights() 
     { 

      // Invoke Method On Creation: 
      Elevate(); 

     } 

     #endregion 

     public void Elevate() 
     { 

      // Get Identity: 
      WindowsIdentity user = WindowsIdentity.GetCurrent(); 

      // Set Principal 
      WindowsPrincipal role = new WindowsPrincipal(user); 

      #region Test Operating System for UAC: 

      if (Environment.OSVersion.Platform != PlatformID.Win32NT || Environment.OSVersion.Version.Major < 6) 
      { 

       // False: 
       _level = false; 

       // Todo: Exception/ Exception Log 

      } 

      #endregion 

      else 
      { 

       #region Test Identity Not Null: 

       if (user == null) 
       { 

        // False: 
        _level = false; 

        // Todo: "Exception Log/Exception" 

       } 

       #endregion 

       else 
       { 

        #region Ensure Security Role: 

        if (!(role.IsInRole(WindowsBuiltInRole.Administrator))) 
        { 

         // False: 
         _level = false; 

         // Todo: "Exception Log/Exception" 

        } 

        else 
        { 

         // True: 
         _level = true; 

        } 

        #endregion 


       } // Nested Else 'Close' 

      } // Initial Else 'Close' 

     } // End of Class. 

Таким образом, приведенный выше код имеет несколько конструкций; он действительно проверит, будет ли пользователь находиться на Vista или выше. Таким образом, если клиент находится на XP без рамки или бета-версии от нескольких лет назад, это позволит вам изменить то, что вы хотели бы сделать.

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

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

Я знаю, что на вопрос был дан ответ; но я думал, что мое решение станет отличным дополнением к странице для всех, кто ищет Stack. Мое рассуждение о Защищенном конструкторе позволит вам использовать этот класс как Производный класс, который вы могли бы контролировать состояние, когда экземпляр класса создается.

+0

Что о http://ayende.com/blog/158401/are-you-an-administrator или http://blogs.msdn.com/b/jaredpar/archive/2007 /08/01/detecting-if-you-are-an-admin.aspx? Что лучше? – Kiquenet

5

Вы также можете позвонить в Windows API, чтобы сделать это:

[DllImport("shell32.dll", SetLastError=true)] 
[return: MarshalAs(UnmanagedType.Bool)] 
static extern bool IsUserAnAdmin(); 

который более обобщенно говорит вам, является ли пользователь работает под повышенными правами.

0

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

Если ваше приложение должно запускаться с правами администратора, это было бы правильно, чтобы обновить его манифест.
requestedExecutionlevel до requireAdminstrator.

1

Вышеуказанные ответы с IsInRole на самом деле правильно: это проверить, если текущий пользователь имеет привилегию администратора.

Начиная с Windows Vista, контроль учетных записей пользователей (UAC) определяет привилегии пользователя.Если вы являетесь членом группы «Встроенные администраторы», вам назначаются два токена доступа во время выполнения: стандартный токен доступа пользователя и токен доступа администратора. По умолчанию вы находитесь в стандартной роли пользователя.

(из MSDN, например, https://msdn.microsoft.com/en-us/library/system.diagnostics.eventlogpermission(v=vs.110).aspx)

Таким образом, IsInRole будет по умолчанию рассматривать привилегии пользователя, и, следовательно, способ вернуть ложь. Верно только тогда, когда программное обеспечение явно запускается как администратор.

Другой метод проверки AD в https://ayende.com/blog/158401/are-you-an-administrator проверяет, находится ли имя пользователя в группе администратора.

Моего метод полного объединения и, таким образом:

public static bool IsCurrentUserAdmin(bool checkCurrentRole = true) 
    { 
     bool isElevated = false; 

     using (WindowsIdentity identity = WindowsIdentity.GetCurrent()) 
     { 
      if (checkCurrentRole) 
      { 
       // Even if the user is defined in the Admin group, UAC defines 2 roles: one user and one admin. 
       // IsInRole consider the current default role as user, thus will return false! 
       // Will consider the admin role only if the app is explicitly run as admin! 
       WindowsPrincipal principal = new WindowsPrincipal(identity); 
       isElevated = principal.IsInRole(WindowsBuiltInRole.Administrator); 
      } 
      else 
      { 
       // read all roles for the current identity name, asking ActiveDirectory 
       isElevated = IsAdministratorNoCache(identity.Name); 
      } 
     } 

     return isElevated; 
    } 

    /// <summary> 
    /// Determines whether the specified user is an administrator. 
    /// </summary> 
    /// <param name="username">The user name.</param> 
    /// <returns> 
    /// <c>true</c> if the specified user is an administrator; otherwise, <c>false</c>. 
    /// </returns> 
    /// <seealso href="https://ayende.com/blog/158401/are-you-an-administrator"/> 
    private static bool IsAdministratorNoCache(string username) 
    { 
     PrincipalContext ctx; 
     try 
     { 
      Domain.GetComputerDomain(); 
      try 
      { 
       ctx = new PrincipalContext(ContextType.Domain); 
      } 
      catch (PrincipalServerDownException) 
      { 
       // can't access domain, check local machine instead 
       ctx = new PrincipalContext(ContextType.Machine); 
      } 
     } 
     catch (ActiveDirectoryObjectNotFoundException) 
     { 
      // not in a domain 
      ctx = new PrincipalContext(ContextType.Machine); 
     } 
     var up = UserPrincipal.FindByIdentity(ctx, username); 
     if (up != null) 
     { 
      PrincipalSearchResult<Principal> authGroups = up.GetAuthorizationGroups(); 
      return authGroups.Any(principal => 
            principal.Sid.IsWellKnown(WellKnownSidType.BuiltinAdministratorsSid) || 
            principal.Sid.IsWellKnown(WellKnownSidType.AccountDomainAdminsSid) || 
            principal.Sid.IsWellKnown(WellKnownSidType.AccountAdministratorSid) || 
            principal.Sid.IsWellKnown(WellKnownSidType.AccountEnterpriseAdminsSid)); 
     } 
     return false; 
    } 

Для пользователя в качестве администратора группы без повышения уровня привилегий (UAC включен), этот метод IsCurrentUserAdmin() возвращает checkCurrentRole: истинно, если checkCurrentRole == лжи, но false, если checkCurrentRole == true

Если вы запустите код, требующий прав администратора, рассмотрите checkCurrentRole == true. В противном случае к этому моменту вы получите исключение безопасности. Поэтому правильный IsInRole логика.