Question

Je voudrais afficher certains éléments de l'interface utilisateur supplémentaires lorsque le processus est en cours d'exécution en tant qu'administrateur par opposition au moment où il n'est pas, semblable à Visual Studio 2008 affiche de l'administrateur »dans la barre de titre lors de l'exécution en tant qu'administrateur. Comment puis-je dire?

Était-ce utile?

La solution

Techniquement, si vous voulez voir si le membre est l'administrateur local compte , alors vous pouvez obtenir le identificateur de sécurité (SID) de l'utilisateur courant à travers le User sur la propriété WindowsIdentity de classe, comme tel (le GetCurrent procédé obtient l'utilisateur Windows):

WindowsIdentity windowsIdentity = WindowsIdentity.GetCurrent();

string sid = windowsIdentity.User.ToString();

Le SecurityIdentifier propriété retourne le SID de l'utilisateur qui a un certain nombre de valeurs prédéfinies pour les différents groupes et les utilisateurs .

Ensuite, vous vérifiez si le SID a le schéma suivant, ce qui indique qu'il est le compte d'administrateur local (qui est un SID bien connu) :

  

S-1-5 - {autres parties du SID} -500

Ou, si vous ne voulez pas analyser des chaînes, vous pouvez utiliser le WellKnownSidType 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 pense que ce que vous vraiment veulent savoir est si l'utilisateur actuel est membre des administrateurs groupe pour la machine locale. Vous pouvez obtenir ce SID en utilisant BuiltinAdministratorsSid de Groups:

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

Ensuite, vous pouvez vérifier la <=> la propriété sur l'utilisateur de l'<=> pour voir si cet utilisateur est un membre du groupe d'administration locale, comme suit:

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

Autres conseils

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

Voici une doublure pour le faire.

using System.Security.Principal;

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

Je sentais qu'il est important de noter la difficulté que je devais avoir tenté d'utiliser WellKnownSidType.BuiltinAdministratorsSid par la réponse de casperOne ci-dessus. Selon le WellKnownSiDType MSDN , BuiltinAdministratorsSid « Indique un SID qui correspond au compte administrateur. » Donc, je me attends le code de casperOne fonctionne, et devinez qu'il fait probable dans certains environnements. Malheureusement, il n'a pas sur mon Windows 2003 avec .NET 2.0 (code existant). En fait, il est revenu 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înes pour startswith « S-1-5-21 » (qui kb 243330 indique le « 21 » est inclus, même si le blog mentionné ci-dessus ne fonctionne pas) et endswith « 500 ».

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top