Detectar se o PowerShell está sendo executado como administrador

36

Como posso saber nos meus scripts se o PowerShell está sendo executado com privilégios de administrador?

Preciso saber porque estou tentando executar um programa que requer a capacidade de abrir portas protegidas.

Bumerangue
fonte
1
Você pode considerar a possibilidade de elevar as permissões, conforme descrito em Como obter privilégios de administrador na resposta do PowerShell
MiFreidgeim pare de ser mau

Respostas:

42
[bool](([System.Security.Principal.WindowsIdentity]::GetCurrent()).groups -match "S-1-5-32-544")

Desmembrando o que isso faz:

  • [bool]- Lance o resultado final para a bool.
  • [System.Security.Principal.WindowsIdentity]::GetCurrent()- Recupera WindowsIdentitypara o usuário em execução no momento.
  • (...).groups- Acesse a groupspropriedade da identidade para descobrir em quais grupos de usuários a identidade é membro.
  • -match "S-1-5-32-544"verifica se groupscontém o SID conhecido do grupo Administradores, a identidade só o conterá se "executar como administrador" for usado.
RMazi
fonte
1
Em vez de apenas postar uma linha de código, você pode explicar o que faz? Isso ajuda os futuros visitantes a entender e adaptar, se necessário.
slhck
BOOO. Dê a este homem mais votos positivos
Kolob Canyon 24/10
4
Prefiro a resposta de @ Bill_Stewart abaixo, pois é livre de seqüências de caracteres mágicas.
8DH
Em vez de usar -matche [Security.Principal.WindowsIdentity]::GetCurrent().Groups -contains 'S-1-5-32-544'
escrever
57
([Security.Principal.WindowsPrincipal] `
  [Security.Principal.WindowsIdentity]::GetCurrent() `
).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)

Isso recupera a identidade atual do Windows e retorna True se a identidade atual tiver a função Administrador (ou seja, estiver executando elevada).

Bill_Stewart
fonte
13
Embora a resposta aceita esteja correta, essa resposta é muito mais clara, especialmente para alguém que pode ler seu script daqui a seis meses.
Patrick Seymour
46

No Powershell 4.0, você pode usar os requisitos na parte superior do seu script:

#Requires -RunAsAdministrator

Saídas:

O script 'MyScript.ps1' não pode ser executado porque contém uma instrução "#requires" para ser executada como Administrador. A sessão atual do Windows PowerShell não está sendo executada como administrador. Inicie o Windows PowerShell usando a opção Executar como administrador e tente executar o script novamente.

eddiegroves
fonte
e se você quiser uma função que saia se não for executada pelo admin?
Kolob Canyon
1
@KolobCanyon - Não é possível executar apenas uma função do PowerShell elevada; todo o processo do PowerShell é elevado ou não.
Bill_Stewart
@Bill_Stewart sim, mas você pode return, se o usuário não é admin :)
Kolob Canyon
1
@KolobCanyon - você só pode elevar o processo do PowerShell ; você não pode elevar uma única função . É por isso que #Requires -RunAsAdministratoré útil: impede que o script inteiro seja executado se você não estiver elevado.
Bill_Stewart
@ Bill_Stewart Sim, vou ter que usar isso em algum momento.
Kolob Canyon