Como posso saber se o meu processo está sendo executado como administrador?
-
21-08-2019 - |
Pergunta
Gostaria de apresentar alguns elementos de interface do usuário extras quando o processo está sendo executado como administrador ao contrário de quando não é, semelhante à forma como o Visual Studio 2008 exibe 'Administrador' em sua barra de título ao executar como administrador. Como posso eu dizer?
Solução
Tecnicamente, se você quiser ver se o membro é o administrador local conta ??em>, então você pode obter o do usuário atual através do propriedade User
na WindowsIdentity
classe, assim (a estática GetCurrent
método recebe o atual usuário do Windows):
WindowsIdentity windowsIdentity = WindowsIdentity.GetCurrent();
string sid = windowsIdentity.User.ToString();
A propriedade User
retorna o SID do usuário que tem uma série de valores pré-definidos para vários grupos e usuários .
Em seguida, você iria verificar para ver se o SID tem o seguinte padrão, indicando que é a conta de administrador local (que é um conhecido SID) :
S-1-5 - {outras partes SID} -500
Ou, se você não quer cordas de análise, você pode usar o 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);
No entanto, suspeito que o que você realmente quer saber é se o usuário atual é um membro dos administradores do grupo para a máquina local. Você pode obter este SID usando o WellKnownSidType
de BuiltinAdministratorsSid
:
// Get the SID of the admin group on the local machine.
var localAdminGroupSid = new SecurityIdentifier(
WellKnownSidType.BuiltinAdministratorsSid, null);
Em seguida, você pode verificar a propriedade Groups
na WindowsIdentity
do usuário para ver se o usuário é um membro do grupo administrador local, assim:
bool isLocalAdmin = windowsIdentity.Groups.
Select(g => (SecurityIdentifier) g.Translate(typeof(SecurityIdentifier))).
Any(s => s == localAdminGroupSid);
Outras dicas
Eu acho que este é um mecanismo bem simples.
using System.Security.Principal;
WindowsIdentity identity = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(identity);
bool isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);
Aqui está um um forro para fazê-lo.
using System.Security.Principal;
static bool IsElevated => new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator);
Eu senti que importante observar a dificuldade que tive com a tentativa de usar WellKnownSidType.BuiltinAdministratorsSid por resposta de casperOne acima. De acordo com a WellKnownSiDType MSDN , BuiltinAdministratorsSid "Indica um SID que coincide com a conta de administrador." Então, eu esperaria o código do casperOne ao trabalho, e acho que ele provavelmente faz em alguns ambientes. Infelizmente, isso não aconteceu no meu Windows 2003 com .NET 2.0 (código legado). É realmente devolvido S-1-5-32-544 que, de acordo com a este artigo é o sid para os administradores grupo . Assim, a comparação falha para mim. Vou ter que fazer minha própria comparação de string para startswith "S-1-5-21" (que kb 243330 indica o "21" está incluído, embora o blog mencionado acima não) e endswith "500".