Mostrando postagens com marcador CIM. Mostrar todas as postagens
Mostrando postagens com marcador CIM. Mostrar todas as postagens

quinta-feira, 31 de agosto de 2017

NotifyIcon

Vamos utilizar o que aprendemos em post anterior para obter informações do sistema operacional para criarmos uma monitoria simples da quantidade de memória livre disponível.

Quando a memória livre estiver abaixo de percentual passado ao script, vamos exibir um balão (ballontip) na área de notificação do windows.

Para montarmos esse script, vamos precisar do seguinte.

Obtermos a quantidade de memória livre disponível, em percentual:
$Sistema = Get-Ciminstance Win32_OperatingSystem

$PercMemLivre = [math]::Round(($Sistema.FreePhysicalMemory/`
                  $Sistema.TotalVisibleMemorySize)*100,2)

Uma função que exiba um balão na área de notificação quando a memória livre estiver abaixo de um valor (em percentual) que especificarmos.
Function _ShowBalloon($PML) {
    $Notifica = New-Object System.Windows.Forms.NotifyIcon
               
    $Notifica.Icon = [System.Drawing.Icon]::ExtractAssociatedIcon(`
    $PSScriptRoot + '\Img\Memory.ico')
.
.
.
    $Notifica.ShowBalloonTip(10000)

} ### _ShowBalloon


O script completo poderia ser esse:
Function MemMonitor {
    [CmdletBinding()]
    Param
    (
      [Parameter(Mandatory=$true,`
      HelpMessage="Indica o tempo de monitoria da memória (em segundos). P.ex.: 60")]
      [ValidateRange(30,7200)]
      [Int]$TempoMonitoria,
      
      [Parameter(Mandatory=$true,`
      HelpMessage="Indica o percentual de memória livre mínima, aceitável como normal. P.ex.: 45")]
      [ValidateRange(20,80)] 
      [Int]$PercMemMin
    )
 
    Add-Type -AssemblyName System.Windows.Forms

    $HoraIni = Get-Date
    $Sistema = Get-Ciminstance Win32_OperatingSystem

    $isNotShowingBalloon = $true
    $HDif = 0
    for ($t=1; $t -le 100000; $t++) {
        $HoraAgora = Get-Date
        $HoraDif = NEW-TIMESPAN –Start $HoraIni End $HoraAgora
        $HDif += $HoraDif.Seconds
        Write-Host $HDif ' - ' $TempoMonitoria
        if ($HDif -ge $TempoMonitoria) {
            While ($isNotShowingBalloon -eq $false) {
                Start-Sleep -Seconds 1
            }
            exit
        }

        $PercMemLivre = [math]::Round(($Sistema.FreePhysicalMemory/`
                        $Sistema.TotalVisibleMemorySize)*100,2)

        if ($PercMemLivre -lt $PercMemMin) {
            if ($isNotShowingBalloon) {
                $isNotShowingBalloon = $false
                _ShowBalloon($PercMemLivre)
                $isNotShowingBalloon = $true
            } 
        }
        else {
            $isNotShowingBalloon = $true
        }
        Start-Sleep -Seconds 10
    }
}

Function _ShowBalloon($PML) {
    $Notifica = New-Object System.Windows.Forms.NotifyIcon
                    
    $Notifica.Icon = [System.Drawing.Icon]::ExtractAssociatedIcon(`
    $PSScriptRoot + '\Img\Memory.ico')

    if ($PML -gt 30) { 
        $Notifica.BalloonTipIcon = 'Warning' 
    }
    else {
        $Notifica.BalloonTipIcon = 'Error' 
    }
    $Notifica.BalloonTipText = [string]$PML + ' %'
    $Notifica.BalloonTipTitle = 'Memória Livre [%]'
    $Notifica.Text = [string]$PML + ' %'
    $Notifica.Visible = $true
    $Notifica.ShowBalloonTip(10000)
    Start-Sleep -Seconds 10
    $Notifica.Visible = $false
    $Notifica.Dispose()

} ### _ShowBalloon

if ($args.Length -lt 2)
{
    MemMonitor
}
else {
    MemMonitor -TempoMonitoria $args[0] -PercMemMin $args[1]
}


E o resultado da execução poderia ser, por exemplo.


Observe que foi utilizado um ícone para exibição na área de notificação.
O mesmo está referenciado na seguinte linha de código.
    $Notifica.Icon = [System.Drawing.Icon]::ExtractAssociatedIcon(`
    $PSScriptRoot + '\Img\Memory.ico')

Ainda, observe que é possível indicar um ícone para o balão (balloontip).
Nesse caso, estamos utilizando Warning quando a memória livre é maior do que 30, mas menor do que o valor especificado para monitorar.

E estamos utilizando Error para representar o ícone quando a memória livre, em percentual, for menor do que, ou igual a, 30.
    if ($PML -gt 30) { 
        $Notifica.BalloonTipIcon = 'Warning' 
    }
    else {
        $Notifica.BalloonTipIcon = 'Error' 
    }

quarta-feira, 30 de agosto de 2017

Obtendo Informações Básicas do Sistema

Para obter informações de sistema podemos utilizar WMI (Windows Management Instrumentation) ou CIM (Common Information Model).


CIM é um padrão aberto da DMTF (Distributed Management Task Force). CIM fornece uma definição comum de informações de gerenciamento para sistemas, redes, aplicações, serviços, permitindo extensões pelos fabricantes. WMI é a implentação do CIM feita pela Microsoft.

Diferenças importantes entre os 2 métodos:
  • CIM utiliza WSMan (WinRM é a implementação da Microsoft), que é SOAP e não tem problemas com firewall, para conectar-se com máquinas remotas, ou seja, se isso não estiver configurado adequadamente, a conexão irá falhar e a informação não será obtida.
  • WMI mantém compatibilidade com sistemas operacionais antigos (legados).
  • CIM tem um menor tempo de resposta, ou seja, melhor desempenho.
  • WMI usa DCOM (Distributed Component Object Model) para se comunicar com máquinas remotas, notoriamente com menor desempenho, além de síncrono e por não ser padronizados tende a não funcionar em outros sitema que não o Windows.
  • WMI fornece melhor abstração de tarefas em comparação aos Cmdlets WsMan, seus resultados são objetos .NET
  • O protocolo WSMan utilizado pelo CIM é mais seguro e escalável; é padronizado, logo tende a funcionar para sistemas não-Windows.

Maik Koster faz interessantes comparativos de desempenho e do porquê CIM é melhor, com medições incluindo gráficos, entre o uso de CIM e WMI, tanto local quanto em rede.

A classe Win32_OperatingSystem, por exemplo, nos permite obter uma série de informações do Sistema Operacional. Para saber o que pode ser obtido, podemos executar o seguinte comando:
PS C:\> Get-CimInstance -Class Win32_OperatingSystem -KeyOnly

Status                                    : 
Name                                      : 
FreePhysicalMemory                        : 
FreeSpaceInPagingFiles                    : 
FreeVirtualMemory                         : 
Caption                                   : 
Description                               : 
InstallDate                               : 
CreationClassName                         : 
CSCreationClassName                       : 
CSName                                    : 
CurrentTimeZone                           : 
Distributed                               : 
LastBootUpTime                            : 
LocalDateTime                             : 
MaxNumberOfProcesses                      : 
MaxProcessMemorySize                      : 
NumberOfLicensedUsers                     : 
NumberOfProcesses                         : 
NumberOfUsers                             : 
OSType                                    : 
OtherTypeDescription                      : 
SizeStoredInPagingFiles                   : 
TotalSwapSpaceSize                        : 
TotalVirtualMemorySize                    : 
TotalVisibleMemorySize                    : 
Version                                   : 
BootDevice                                : 
BuildNumber                               : 
BuildType                                 : 
CodeSet                                   : 
CountryCode                               : 
CSDVersion                                : 
DataExecutionPrevention_32BitApplications : 
DataExecutionPrevention_Available         : 
DataExecutionPrevention_Drivers           : 
DataExecutionPrevention_SupportPolicy     : 
Debug                                     : 
EncryptionLevel                           : 
ForegroundApplicationBoost                : 
LargeSystemCache                          : 
Locale                                    : 
Manufacturer                              : 
MUILanguages                              : 
OperatingSystemSKU                        : 
Organization                              : 
OSArchitecture                            : 
OSLanguage                                : 
OSProductSuite                            : 
PAEEnabled                                : 
PlusProductID                             : 
PlusVersionNumber                         : 
PortableOperatingSystem                   : 
Primary                                   : 
ProductType                               : 
RegisteredUser                            : 
SerialNumber                              : 
ServicePackMajorVersion                   : 
ServicePackMinorVersion                   : 
SuiteMask                                 : 
SystemDevice                              : 
SystemDirectory                           : 
SystemDrive                               : 
WindowsDirectory                          : 
PSComputerName                            : 
CimClass                                  : root/cimv2:Win32_OperatingSystem
CimInstanceProperties                     : {Caption, Description, InstallDate, Name...}
CimSystemProperties                       : Microsoft.Management.Infrastructure.CimSystemProperties

E então podemos selecionar as Propriedades que desejarmos, como por exemplo:
CLS

Get-CimInstance Win32_OperatingSystem | Select-Object Caption, `
OSArchitecture, BuildNumber, TotalVisibleMemorySize | FL

Obtendo um resultado semelhante ao abaixo, variando obviamente de acordo com o computador em questão:
Caption                : Microsoft Windows 10 Pro
OSArchitecture         : 64 bits
BuildNumber            : 15063
TotalVisibleMemorySize : 4025964