Controleer of de huidige gebruiker beheerder is

Mijn toepassing moet enkele scripts uitvoeren en ik moet er zeker van zijn dat de gebruiker die ze uitvoert een beheerder is… Wat is de beste manier om dit te doen met C#?


Antwoord 1, autoriteit 100%

using System.Security.Principal;
public static bool IsAdministrator()
{
    using (WindowsIdentity identity = WindowsIdentity.GetCurrent())
    {
        WindowsPrincipal principal = new WindowsPrincipal(identity);
        return principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
}

Antwoord 2, autoriteit 36%

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

Antwoord 3, autoriteit 21%

Je kunt hiervoor ook de Windows API aanroepen:

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

die u meer algemeen vertelt of de gebruiker onder verhoogde rechten werkt.


Antwoord 4, autoriteit 14%

De bovenstaande antwoorden met IsInRolezijn eigenlijk juist: er wordt wel gecontroleerd of de huidige gebruiker beheerdersrechten heeft.
Echter,

Vanaf Windows Vista bepaalt Gebruikersaccountbeheer (UAC) de rechten van een gebruiker. Als u lid bent van de groep Ingebouwde beheerders, krijgt u twee runtime-toegangstokens toegewezen: een standaard gebruikerstoegangstoken en een beheerderstoegangstoken. Standaard bevindt u zich in de standaard gebruikersrol.

(van MSDN, bijv. https://msdn.microsoft.com/en-us/library/system.diagnostics.eventlogpermission(v=vs.110).aspx)

Dus IsInRolezal standaard rekening houden met het gebruikersrecht, en dus retourneert de methode false. Alleen waar als de software expliciet als beheerder wordt uitgevoerd.

De andere methode om AD te controleren in https://ayende.com/blog/ 158401/bent u een beheerdercontroleert of de gebruikersnaam in een beheerdersgroep staat.

Mijn volledige methode om beide te combineren is als volgt:

   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;
    }

Voor een gebruiker in een beheerdersgroep zonder verhoogde bevoegdheden (UAC ingeschakeld), retourneert deze methode IsCurrentUserAdmin() !checkCurrentRole: true if checkCurrentRole==false, maar false if checkCurrentRole==true

Als u code uitvoert waarvoor beheerdersrechten VEREIST zijn, overweeg dan de checkCurrentRole==true. Anders krijgt u tegen die tijd een beveiligingsuitzondering.
Daarom de juiste IsInRole-logica.


Antwoord 5, autoriteit 2%

Ik dacht ik voeg nog een oplossing toe; omdat de IsInRoleniet altijd werkt.

  • Als de gebruiker geen lid is van de opgegeven Windows-gebruikersgroep in de huidige sessie.
  • De beheerder heeft wijzigingen aangebracht in de instellingen voor Groepsbeleid
  • De rolparameter wordt behandeld als een ‘Hoofdlettergevoelig’-methode.
  • En als op een XP-machine de .NET Framework-versie niet is geïnstalleerd, werkt deze niet.

Afhankelijk van uw behoeften of u oudere systemen moet ondersteunen; of niet zeker weet hoe uw klant uw systeem fysiek beheert. Dit is een oplossing die ik heb geïmplementeerd; voor flexibiliteit en aanpassingen.

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.

Dus de bovenstaande code heeft een paar constructies; Het zal daadwerkelijk testen om te zien of de gebruiker op Vista of hoger is. Op die manier als een klant op XP is zonder een raamwerk of bètapramwerk van jaren geleden, zal het u in staat stellen te wijzigen wat u wilt doen.

Dan zal het fysiek testen om een ​​nulwaarde voor het account te vermijden.

LAATSTE VAN ALLES ZAL HET VERZOEKEN VAN HET CONTROLE OM TE VERPLICHTEN DAT DE GEBRUIKER INDOOD IN DE PROUWE ROL IS.

Ik weet dat de vraag is beantwoord; Maar ik dacht dat mijn oplossing een geweldige aanvulling zou zijn op de pagina voor iemand anders die op zoek is naar stapel. Mijn redenering achter de beschermde constructor stelt u in staat om deze klasse te gebruiken als een afgeleide klasse die u de toestand van wanneer de klasse inleiding zou kunnen hebben.

Other episodes