Domanda

Vorrei visualizzare alcuni elementi dell'interfaccia utente in più quando il processo viene eseguito come amministratore rispetto a quando non lo è, simile a come Visual Studio 2008 visualizza 'amministratore' nella barra del titolo durante l'esecuzione come amministratore. Come posso dire?

È stato utile?

Soluzione

Tecnicamente, se si vuole vedere se il socio è l'amministratore locale conto , allora si può ottenere il identificatore di protezione (SID) dell'utente corrente attraverso il User proprietà sul WindowsIdentity classe , il metodo in questo modo (il href="http://msdn.microsoft.com/en-us/library/sfs49sw0.aspx" GetCurrent ottiene l'utente corrente di Windows):

WindowsIdentity windowsIdentity = WindowsIdentity.GetCurrent();

string sid = windowsIdentity.User.ToString();

Il SecurityIdentifier proprietà restituisce il SID dell'utente che ha un certo numero di valori predefiniti per i vari gruppi e utenti .

Poi si dovrebbe verificare se il SID ha il seguente modello, indicando che è l'account di amministratore locale (che è un SID noto) :

  

S-1-5 - {parti altra SID} -500

In alternativa, se non si vuole analizzare le stringhe, è possibile utilizzare il 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);

Tuttavia, ho il sospetto che quello che davvero vorrei sapere è se l'utente corrente è un membro degli amministratori gruppo per la macchina locale. È possibile ottenere questo SID utilizzando il BuiltinAdministratorsSid di Groups:

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

Quindi è possibile controllare la <=> proprietà sul <=> degli utenti per vedere se l'utente è un membro del gruppo di amministratore locale, in questo modo:

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

Altri suggerimenti

Credo che questo sia un buon meccanismo semplice.

using System.Security.Principal;

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

Ecco un uno di linea per farlo.

using System.Security.Principal;

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

ho ritenuto importante notare la difficoltà che ho avuto con il tentativo di utilizzare WellKnownSidType.BuiltinAdministratorsSid per la risposta di casperOne sopra. Secondo il WellKnownSiDType MSDN , BuiltinAdministratorsSid "Indica un SID che corrisponde l'account amministratore." Quindi mi aspetto il codice di casperOne al lavoro, e immagino che probabilmente fa in alcuni ambienti. Purtroppo, non ha fatto sul mio Windows 2003 con .NET 2.0 (codice legacy). In realtà restituito S-1-5-32-544 che, secondo questo articolo rappresenta l'sid per gli amministratori di gruppo . Così, il confronto ha esito negativo per me. Dovrò fare il mio confronto di stringhe per startswith "S-1-5-21" (che kb 243330 indica il "21" è inclusa anche se il blog di cui sopra non) e endswith "500".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top