Microsoft Windows PowerShell

Juntemo-nos ao “lado negro da força…”

Construamos alguns scripts mais vocacionados para administração da máquina propriamente dita.

  • Firewall
$profile = (new-object -com HNetCfg.FwMgr).LocalPolicy.CurrentProfile
 
# Lista portas abertas
$profile.Services | ? {$_.Enabled} | select -expand GloballyOpenPorts 
 
# Lista aplicações Autorizadas
$profile.AuthorizedApplications | ? {$_.Enabled} | ft name 
 
# Lista serviços
$profile.Services | ? {$_.Enabled} | ft name 
  • HotFixes instalados no sistema
$strComputer = "."
 
$colItems = get-wmiobject -class "Win32_QuickFixEngineering" -namespace "rootCIMV2" -computername $strComputer
 
foreach ($objItem in $colItems) {
      write-host "Origem: " $objItem.Caption
      write-host "CS: " $objItem.CSName
      write-host "Descrição: " $objItem.Description
      write-host "Comentários: " $objItem.FixComments
      write-host "HotFix ID: " $objItem.HotFixID
      write-host "Data Instalação: " $objItem.InstallDate
      write-host "Nome: " $objItem.Name
      write-host "Service Pack : " $objItem.ServicePackInEffect
      write-host "Estado: " $objItem.Status
      write-host
}

Neste último exemplo foi usado o cmdlet get-wmiobject. Este cmdlet faz o interface com o WMI (Windows Management Instrumentation) do Windows. O WMI é uma API do Sistema Operativo Windows que permite a obtenção da mais variada informação sobre a máquina em si. O WMI funciona por perguntas à diversas classes. Para mais informações sobre esta API usem o URL http://msdn.microsoft.com/en-us/library/aa384642(VS.85).aspx.

  • Listar as partilhas de rede
$strComputer = "."
 
$colItems = get-wmiobject -class "Win32_Share" -namespace "rootCIMV2" -computername $strComputer
 
foreach ($objItem in $colItems) {
      write-host "Máscara Acesso: " $objItem.AccessMask
      write-host "Maximo Permitido: " $objItem.AllowMaximum
      write-host "Descrição: " $objItem.Description
      write-host "Nome: " $objItem.Name
      write-host "Path: " $objItem.Path
      write-host "Estado: " $objItem.Status
      write-host "Tipo: " $objItem.Type
      write-host
}
  • LoggOff ShutDown, Reboot
# Fazer Logoff na própria máquina
$strComputer = "."
(Get-WmiObject -Class Win32_OperatingSystem -ComputerName $strComputer).InvokeMethod("Win32Shutdown",0)
 
# Outra forma de fazer loggOff
(gwmi Win32_OperatingSystem).Win32Shutdown(0)
 
# Fazer Logoff a uma máquina remota
$strComputer = "Servidor-Blade"
(gwmi win32_operatingsystem -ComputerName $strComputer ).Win32Shutdown(0) 
 
# Fazer Logoff a uma máquina remota pedindo credencias
(gwmi win32_operatingsystem -ComputerName $strComputer  -cred (get-credential)).Win32Shutdown(0) 
 
# Fazer Shutdown
(gwmi win32_operatingsystem).Win32Shutdown(8)
 
# Forçar Shutdown
(gwmi win32_operatingsystem).Win32Shutdown(12)
 
# Fazer Reboot
(gwmi win32_operatingsystem).Win32Shutdown(2)
 
# Forçar Reboot
(gwmi win32_operatingsystem).Win32Shutdown(6)

Variáveis especiais

VariávelDescrição
$_Resultado do Pipeline; Usado em blocos de scripts, filtros, funções, where-object for-each, etc
$$Contém o último token do último input
$?Contém o estado de sucesso/falha da última operação
$ArgsUsado na criação de funções ao qual é exigida uma passagem de parâmetros
$ErrorContém o último erro gerado
$foreachRefere-se ao enumerador do ciclo for-each
$HOMEA directoria do utilizador
$inputInput pipe para uma função ou bloco de código
$MatchTabela de Hash com os elementos encontrados pelo operador -match
$MyInvocationInformação sobre o script actual
$HostHost actual
$LastExitCodeO código de saída da última aplicação nativa que foi executada
$trueTRUE
$falseFALSE
$nullNULL
$falseFALSE
$OFSCampo Separador de Output
$ShellIDO Identificador da SHELL
$StackTraceContém o StackTrace do último erro

Ajudas

Caso necessitemos de aceder à ajuda de algum cmdlet, basta invocar o comando get-Help.

#ajuda sobre o cmdlet export-csv
get-Help export-Csv -full
 
#listar todos os comandos disponiveis que contenham a string "A"
get-Command | Where {$_.name -match "A"} 

Alguns Providers

NomeAliasesDescrição
Get-LocationglDirectoria corrente
Set-LocationslMuda de directoria
Copy-ItemcpiCopia ficheiros
Remove-ItemriRemove um ficheiro/directoria
Move-ItemmiMove um ficheiro
Rename-ItemrniMuda o nome a um ficheiro
New-ItemniCria uma nova directoria
Clear-ItemcliLimpa o conteúdo de um ficheiro
Set-ItemsiDefine o conteúdo de um ficheiro
Mkdirn/aCria uma directoria
Get-ContentgcEnvia o conteúdo de um ficheiro para o output
Set-ContentscDefine o conteúdo de um ficheiro

Normalmente para pesquisar todos os aliases basta usarmos o seguinte comando:

Get-Alias

Conclusão

Os benefícios desta linguagem são óbvios. Tendo sido desenvolvida da robustez e extensibilidade da framework .NET, o PowerShell permite-nos desenvolver poderosos componentes, de uma forma eficaz e rápida. Pessoalmente penso que é um enorme upgrade em diversos níveis. Espero que vos seja útil.

Referências