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?

Foi útil?

Solução

Tecnicamente, se você quiser ver se o membro é o administrador local conta , 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".

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top