32 votes

Comment puis-je savoir si mon processus est exécuté en tant qu'administrateur ?

J'aimerais afficher quelques éléments d'interface utilisateur supplémentaires lorsque le processus est exécuté en tant qu'administrateur et non lorsqu'il ne l'est pas, de la même manière que Visual Studio 2008 affiche "Administrator" dans sa barre de titre lorsqu'il est exécuté en tant qu'administrateur. Comment puis-je le savoir ?

0 votes

La réponse à cette question est la même : stackoverflow.com/questions/95912/

0 votes

Jetez également un coup d'œil ici blackwasp.co.uk/CheckAdmin.aspx

35voto

casperOne Points 49736

Techniquement, si vous voulez voir si le membre est l'administrateur local compte alors vous pouvez obtenir le identifiant de sécurité (SID) de l'utilisateur actuel par le biais de la User propriété sur le WindowsIdentity classe comme suit : (le statique GetCurrent méthode obtient l'utilisateur actuel de Windows) :

WindowsIdentity windowsIdentity = WindowsIdentity.GetCurrent();

string sid = windowsIdentity.User.ToString();

El User renvoie le SID de l'utilisateur qui a un certain nombre de valeurs prédéfinies pour différents groupes et utilisateurs .

Ensuite, vous devez vérifier si le SID a le schéma suivant, indiquant qu'il s'agit du compte administrateur local (qui est un SID bien connu) :

S-1-5- {autres pièces du SID} -500

Ou, si vous ne voulez pas analyser les chaînes de caractères, vous pouvez utiliser la fonction SecurityIdentifier classe :

// Get the built-in administrator account.
var sid = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, 
    null);

// Compare to the current user.
bool isBuiltInAdmin = (windowsIdentity.User == sid);

Cependant, je soupçonne que ce que vous vraiment veut savoir si l'utilisateur actuel est un membre des administrateurs groupe pour la machine locale. Vous pouvez obtenir ce SID en utilisant la commande WellKnownSidType de BuiltinAdministratorsSid :

// Get the SID of the admin group on the local machine.
var localAdminGroupSid = new SecurityIdentifier(
    WellKnownSidType.BuiltinAdministratorsSid, null);

Vous pouvez alors vérifier le Groups propriété sur le WindowsIdentity de l'utilisateur pour voir si cet utilisateur est membre du groupe admin local, comme ceci :

bool isLocalAdmin = windowsIdentity.Groups.
    Select(g => (SecurityIdentifier) g.Translate(typeof(SecurityIdentifier))).
    Any(s => s == localAdminGroupSid);

2 votes

Est-ce que cela vérifie si l'utilisateur actuel est un administrateur ou si le processus est exécuté en tant qu'administrateur ? Un utilisateur qui n'est pas administrateur peut toujours exécuter un processus en tant qu'administrateur en cliquant avec le bouton droit de la souris sur le processus et en sélectionnant "Exécuter en tant qu'administrateur".

1 votes

@JanTacci Si l'utilisateur clique avec le bouton droit de la souris et choisit de s'exécuter en tant qu'administrateur, le processus s'exécute alors en tant qu'utilisateur du groupe administrateur sélectionné dans la boîte de dialogue UAC qui s'affiche, le processus n'est pas exécuté sous l'utilisateur connecté à ce moment-là.

2 votes

Être un administrateur et exécuter l'application en tant qu'administrateur sont deux choses différentes. Même si je suis un administrateur, je peux toujours exécuter l'application sans privilèges, ce qui, dans ma situation, me pose des problèmes.

21voto

Kenn Points 1021

Je pense que c'est un bon mécanisme simple.

using System.Security.Principal;

WindowsIdentity identity = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(identity);
bool isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);

4voto

Lone Coder Points 2417

Voici une phrase pour le faire.

using System.Security.Principal;

static bool IsElevated => new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator);

0voto

tbradt Points 73

Il m'a semblé important de signaler la difficulté que j'ai rencontrée en essayant d'utiliser WellKnownSidType.BuiltinAdministratorsSid selon la réponse de casperOne ci-dessus. Selon le TypeSiDType connu MSDN , BuiltinAdministratorsSid "Indique un SID qui correspond au compte administrateur". Je m'attendrais donc à ce que le code de casperOne fonctionne, et je suppose qu'il le fait probablement dans certains environnements. Malheureusement, il ne l'a pas fait sur mon Windows 2003 avec .NET 2.0 (code hérité). Il a en fait retourné S-1-5-32-544 qui, selon cet article est le sid pour les administrateurs groupe . Ainsi, la comparaison échoue pour moi. Je vais devoir faire ma propre comparaison de chaîne pour startswith "S-1-5-21" (que kb 243330 indique que le "21" est inclus même si le blog référencé ci-dessus ne le fait pas) et endswith "500".

-1voto

SoumyaMahunt Points 434

J'utilise une déclaration simple try catch pour créer un fichier aléatoire dans " C:\Windows\ " dossier. S'il y a erreur, l'application fonctionne avec des privilèges normaux, sinon elle fonctionne avec des privilèges d'administrateur.

        try
        {
            File.Create(string.Format(@"C:\Windows\{0}.txt", new Guid()), 0, FileOptions.DeleteOnClose);
            // Do as admin
        }
        catch
        {
            // Do as default
        }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X