Come faccio a sapere se il mio processo è in esecuzione come amministratore?
-
21-08-2019 - |
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?
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".