BSOD

Categories: TI, Windows

Existem cenários que você precisa entender o que está acontecendo no ambiente, na sua aplicação, no SO, reiniciar a máquina e perder o que está acontecendo não é uma opção.

Se a aplicação é consistente na geração de Logs, ou o Windows consegue manter os logs de um problema enquanto a maquina está “travada” já ajuda consideravelmente, mas existem cenários que infelizmente tudo para de uma tal forma que infelizmente só um reboot salva, mas vc vai perder a rastreabilidade do problema.

Para situações como essa, alguns servidores possuem bem próximo ao botão de liga/desliga um outro botão de interrupção do SO onde força o despejo de memória através de uma Tela Azul da Morte para o arquivo de dump para uma análise posterior do ocorrido (verificar o manual do seu fabricante).

Para outros cenários, principalmente quando você não tem acesso ao servidor físico, existe a opção de adicionar duas chaves de registro que vão gerar esse BSOD no seu Windows (Cliente ou Servidor).

Windows Registry Editor Version 5.00

; For PS/2 keyboards
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters]
"CrashOnCtrlScroll"=dword:00000001

; For USB keyoards
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\kbdhid\Parameters]
"CrashOnCtrlScroll"=dword:00000001

Adicionadas estas chaves, reinicie o seu Windows.

Pressionando CTRL + 2x Scroll Lock o Windows vai iniciar o processo da Tela Azul.

Atenção !!!

Existem outras configurações necessárias para que isso funcione direito e você tenha o que analisar !

  1. Espaço em disco (Normalmente ninguém se preocupa onde está o Page File nem mesmo a configuração do Dump)
  2. Configuração do Dump (Se você nunca mexeu ele é Full RAM e vai gerar o arquivo na unidade C)
  3. Mais espaço em Disco (A geração do arquivo de Dump vem com a memória RAM e o conteúdo do PF, no final do processo o Windows gera um PF novo)
  4. Tempo (é totalmente variável já que trata-se de toda a memória da maquina sendo armazenada em um arquivo, quanto mais RAM usada maior é o arquivo)

Se você conseguir gerar um dump bem sucedido, vai conseguiu analisar com o WinDBG.

Boa Sorte.

Como não se atrasar para uma reunião – com o Zoom

Categories: Powershell, Windows

Nessa época de pandemia estamos tendo que nos reinventar em muitas coisas que não dávamos importância, que eram tratadas como corriqueiras e bla bla bla… essa história triste todos já sabemos, estamos vivendo ela…

Quem tem criança sabe como está “interessante” ajustar a rotina para acompanhar os estudos, terem aulas online não significa facilidade para os pais, cada um tem seu horário, aulas em horários diferentes e esperar que a criança entenda que ela tem que entrar no link certo para a aula certa, dependendo da idade, pode ser complicado as vezes eles ainda nem sabem os dias da semana.

No nosso caso, a escola manda um arquivo pdf com uma grade para a semana, o mesmo link do zoom para as aulas recorrentes e links destintos para aulas “complementares”, o problema fica que a cada semana eles alteram o horário de inicio das aulas, essa falta de constante complica em se ajustar ao quadro de aula, como temos 2 peças raras e cada um tem uma agenda de inicio de aula diferente com quadro de aulas diferente no inicio da manhã fica uma correria em abrir o link para um em um computador e esperar até a hora do outro para abrir o link para o outro em outro computador, sair de uma “aula” para abrir o link para a outra e ter certeza que abriu o da semana certa no dia certo.

Com essa enrolação de contexto, agora vem a solução, afinal a TI veio para resolver problemas que não tínhamos que ela mesma causou.

O script abaixo ainda é um protótipo, basicamente é um powershell para ler a URL da reunião do Zoom, converter para um padrão usado pelo cliente do Zoom e criar uma tarefa no “Agendador de Tarefas” para que no horário específico ele abra o Zoom e entre na reunião automaticamente.

Como as aulas recorrentes acontecem com o mesmo link de reunião não tive que me importar em conseguir colocar várias execuções para a mesma tarefa do agendador, fica mais prático para organização, eu poderia ter seguido a mesma lógica para as aulas adicionais, mas ficaria um serviço mau feito.

As aulas adicionais são tratadas como tarefas individuais no agendador.

* Comentário 1: eu poderia ter feito um replace mais simples e direto, mas preferi serializar para ficar mais didático.

* Comentário 2: Esse script funciona no Windows 8 para cima, para o Windows 7 estou trabalhando nas modificações de agendamento, pois no 7 os comandos no powershell são diferentes.

* Comentário 3: No “Agendador de Tarefas” crie um diretório chamado “Aulas”, fica mais fácil de organizar

$aula = "Aula Filho 0"

#Aula Recorrente
$url = "https://escola.zoom.us/j/3456031299?pwd=UUIzTxxxTASDFNMSjHHanpJVkhCZ007"
$dataSeg = "2020-07-27 8:50 AM"
$dataTer = "2020-07-28 9:50 AM"
$dataQua1 = "2020-07-29 8:50 AM"
$dataQua2 = "2020-07-29 10:27 AM"
$dataQui = "2020-07-30 9:50 AM"
$dataSex = "2020-07-31 9:50 AM"

#Aula Inglês
$urlIng = "https://escola.zoom.us/j/93298210546?pwd=Y1B6UGhKT2493057djGTDLceVp4Zz09"
$dataIng = "2020-07-29 9:44 AM"
$aulaIng = "Aula Ingles"

#Aula Música
$urlMusica = "9h00 às 9h40 https://escola.zoom.us/j/37400021157?pwd=OOOcjyys076hWENGQUJ3YjVpdz09"
$dataMusica = "2020-07-30 8:50 AM"
$aulaMusica = "Aula Musica"

#Aula Educação Física
$urlEdF = "https://escola.zoom.us/j/93048619154?pwd=TkYzSk5XMdnttha8654j2XTlEzQT09"
$dataEdF = "2020-07-31 8:50 AM"
$aulaEdF = "Aula Ed. Fisica"


#caminho do binário do Zoom
$caminho = "%APPDATA%\Zoom\bin\Zoom.exe"

#replace aula recorrente
$parte1 = $url -replace "\?", "&"
$parte2 = $parte1 -replace "/j/", "/join?action=join&confno="
#$parte3 = $parte2 -replace "https:", "%APPDATA%\Zoom\bin\Zoom.exe --url=zoommtg:"
$parte3 = $parte2 -replace "https:", " --url=zoommtg:"


#$parte3

#replace aula ingles
$parte1Ing = $urlIng -replace "\?", "&"
$parte2Ing = $parte1Ing -replace "/j/", "/join?action=join&confno="
$parte3Ing = $parte2Ing -replace "https:", " --url=zoommtg:"

#replace aula Musica
$parte1Musica = $urlMusica -replace "\?", "&"
$parte2Musica = $parte1Musica -replace "/j/", "/join?action=join&confno="
$parte3Musica = $parte2Musica -replace "https:", " --url=zoommtg:"

#replace aula Ed. Física
$parte1EdF = $urlEdF -replace "\?", "&"
$parte2EdF = $parte1EdF -replace "/j/", "/join?action=join&confno="
$parte3EdF = $parte2EdF -replace "https:", " --url=zoommtg:"


#w7
#Library\Microsoft\Windows\PowerShell\ScheduledJobs
#$trigger = New-JobTrigger -Once -At $dataSeg -At $dataTer -At $dataQua1 -At $dataQua2 -At $dataQui -At $dataSex
#Register-ScheduledJob -Name $aula -FilePath $caminho -ArgumentList $parte3 -Trigger $trigger 


#w8 +

#Cria o agendamento inicial para as aulas recorrentes 
$action = New-ScheduledTaskAction -Execute '%APPDATA%\Zoom\bin\Zoom.exe' -Argument $parte3

$trigger =  @(
            $(New-ScheduledTaskTrigger -Once -At $dataSeg),
            $(New-ScheduledTaskTrigger -Once -At $dataTer),
            $(New-ScheduledTaskTrigger -Once -At $dataQua1),
            $(New-ScheduledTaskTrigger -Once -At $dataQua2),
            $(New-ScheduledTaskTrigger -Once -At $dataQui),
            $(New-ScheduledTaskTrigger -Once -At $dataSex))

Register-ScheduledTask -Action $action -Trigger $trigger -TaskName $aula -TaskPath "aulas"

#altera o agendamento para a adição das outras aulas
#ingles
$actionIng = New-ScheduledTaskAction -Execute '%APPDATA%\Zoom\bin\Zoom.exe' -Argument $parte3Ing
$triggerIng = New-ScheduledTaskTrigger -Once -At $dataIng
Register-ScheduledTask -Action $actionIng -Trigger $triggerIng -TaskName $aulaIng -TaskPath "aulas"


#Musica
$actionMusica = New-ScheduledTaskAction -Execute '%APPDATA%\Zoom\bin\Zoom.exe' -Argument $parte3Musica
$triggerMusica = New-ScheduledTaskTrigger -Once -At $dataMusica
Register-ScheduledTask -Action $actionMusica -Trigger $triggerMusica -TaskName $aulaMusica -TaskPath "aulas"

#Ed. Fisica
$actionEdF = New-ScheduledTaskAction -Execute '%APPDATA%\Zoom\bin\Zoom.exe' -Argument $parte3EdF
$triggerEdF = New-ScheduledTaskTrigger -Once -At $dataEdF
Register-ScheduledTask -Action $actionEdF -Trigger $triggerEdF -TaskName $aulaEdF -TaskPath "aulas"

Para uma imaginação mais fértil, da para usar isso para qualquer reunião com o Zoom #FicaDica

Para finalizar, quando não quiser mais as tarefas é só abrir o “Agendador de Tarefas” e apagar as tarefas

VMWare Workstation no Win10 com CG DG Error

Categories: Powershell, TI, Uncategorized, Vmware, Windows

Tenho no meu note o Windows 10 (Version 200514-1410 Build 19631.1) e uso como virtualizador o VMWare Workstation 15 (15.5.2 build-15785246)

Esse Windows 10 faz parte do programa insider, então toda a semana tem uma atualização.

Por que não usar o Hyper-V ? A resposta é simples: Não quero e pronto. A maquina é minha e gosto mais do vmware.

Alinhados quanto a isso, depois que o Windows atualizou para o Build 19000+ o VMWare resolveu parar de funcionar e não iniciava nenhuma máquina. Ele começou a apresentar a mensagem abaixo para qualquer máquina virtual:

Ele indica um link para mais detalhes que acaba direcionando para um outro link: https://kb.vmware.com/s/article/2146361

Basicamente, se seguir o que o site diz não faz diferença nenhuma e não resolve nada, você vai ser direcionado para o site da Microsoft (https://docs.microsoft.com/en-us/windows/security/identity-protection/credential-guard/credential-guard-manage) e de lá se fizer todos os procedimentos também vai terminar não resolvendo.

O processo para resolver o problema é bem mais simples que os procedimentos que eles passam.

Abra o Powershell em modo administrativo e execute o seguinte comando:

bcdedit /set hypervisorlaunchtype off

Após isso ele informa que:

The operation completed successfully.

E aí é só reiniciar o PC e tudo volta ao normal.

Liberar toda a memória do servidor

Categories: Scripts, SQL, SQLPASS, SQLServerPedia syndication, TI, Virtual PASS BR, Windows

Todos sabemos que o SQL é um consumidor de memória frenético, quanto mais memória disponível mais memória ele vai reservar para ele.

O que é um desenho “by default”, ele sempre fará isso afinal de contas ele precisa alocar as páginas de dados do seu banco em algum lugar.

Para resolver todos os seus problemas, existe uma forma de liberar toda a memória disponível de uma só vez do seu servidor e não é parando o serviço do SQL.

Para isso, você vai precisar o Visual Studio instalado, vamos criar um novo projeto dele…

Importante! Abra o Visual Studio como administrador !

Novo projeto de linha de comando

Escreva o nome que quiser para o app

Copie e cole o código abaixo no projeto:

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;

public class CriticalProcess
{
    [DllImport("ntdll.dll", SetLastError = true)]
    private static extern int NtSetInformationProcess(IntPtr hProcess, int processInformationClass, ref int processInformation, int processInformationLength);

    static void Main(string[] args)
    {
        int isCritical = 1;  // queremos que ele seja um processo crítico
        int BreakOnTermination = 0x1D;  // valor para BreakOnTermination (flag)

        Process.EnterDebugMode();  //acquire Debug Privileges

        // configurando o BreakOnTermination = 1 para o processo ativo
        NtSetInformationProcess(Process.GetCurrentProcess().Handle, BreakOnTermination, ref isCritical, sizeof(int));
    }
}

Se tudo ocorrer como esperado, dependendo da quantidade de memória do seu servidor isso pode demorar de alguns segundos a algumas horas.

Por mais que tenhamos criado uma aplicação de linha de comando a primeira parte do processo é bem gráfica e todos já tiveram o grande prazer de conhecer:

Ele vai gerar um DUMP de toda a memória para o arquivo de paginação e depois que a maquina reiniciar ele vai copiar esse arquivo de paginação para um arquivo chamado memory.dump

É só isso,,, execução e queda,,,

Agora falando sério: NUNCA !!!! JAMAIS !!!!! Simplesmente pegue o código de qualquer coisa que você encontra na internet e saia executando sem antes entender o que ele faz.

Esse exemplo é bem ridículo, mas imagina um script que você leu o por alto achando que vai resolver todos os seus problemas de backup, ou de fragmentação de índice e descobre que no meio tem um sp_msforeach_table com um sp_msforeach_db que trunca as tabelas, ou pior, alguém cria uma chave de criptografia e habilita TDE nas suas bases e depois força a remoção da chave,,,, a culpa é tão e somente sua! Você é o DBA é sua responsabilidade preservar os dados.

Tenha discernimento com o que você copia da internet e de onde copia essas informações.

SEMPRE LEIA e NUNCA EXECUTE DIRETAMENTE EM PRODUÇÃO !!!

Apagar arquivos de backup duplicados

Categories: Powershell, SQLServerPedia syndication, Windows

Imagine o seguinte cenário:

Você tem sua rotina de backup (FULL, DIFF, LOG) que gera os arquivos de saída como por exemplo BKPFULL_BASE_XPTO_01_DE_04_20181105.bak e coisas parecidas com isso.

Sua ferramenta de backup copia esses arquivos para uma área de staging todos os dias, marcando os arquivo com o bit de arquivado, no dia seguinte você tem um step do job que procura por esses arquivos e apaga ele, afinal, já foram marcados como arquivados pelo software de backup.

Em um certo momento, alguma coisa aconteceu nessa rotina da ferramenta e ela não marcou os arquivos ou simplesmente não rodou.

Para não ficar sem espaço em disco você resolve apagar o arquivo mais antigo do backup deixando pelo menos o mais recente no disco, para um ambiente com poucas bases isso é tranquilo, imagine isso para um ambiente com algumas centenas de bases, em um final de semana prolongado, algumas bases com 3 ou 4 arquivos de backup, outras com apenas 1 arquivo.

O PowerShell abaixo faz um parse no nome do arquivo para agrupar pelo tipo do backup e o nome do banco, procura onde tem mais de uma entrada (imaginando que você separa isso por discos), remove do resultado o mais recente e apaga os mais antigos.

O script não é perfeito, ainda faltam alguns detalhes à serem melhorados, mas já é uma ajuda em casos como esse:

 


Get-ChildItem "X:\Backup\Disk02\" -file | where Name -match "._(\d{4})(\d{2})(\d{2})" | Where-Object {$_.Attributes -Eq "Normal"} | #Esse Atributo é o que o software de backup marca como retido, retire este Where-Object caso queira desconsiderar isso
select fullname, #@{N="DtFile";E={[DateTime]$_.BaseName.substring($_.BaseName.length -10).replace("_", "-")}},
@{N="FileWithoutDate";E={$_.BaseName.substring(0, $_.BaseName.length -18)}} |
group FileWithoutDate |
where Count -GE 2 |
%{ $_.Group | sort fullname,DtFile -Descending | select -skip 1} | %{Remove-Item $_.FullName -WhatIf}

Múltiplas conexões RDP no Windows 8 e 10

Categories: Windows

Imagine o seguinte cenário: você está longe da sua máquina bem potente em casa e quer acessá-la remotamente mas tem outra pessoa utilizando-se dela. 

Ou você espera ela parar de usar, ou compartilha o acesso e todos veem o que está sendo feito, ou instala alguma versão server e habilita o TS. 

Existe uma solução mais simpática, podemos alterar a DLL responsável pelo gerenciamento do RDP e ele vai se comportar parecido com a versão servidor. Desta forma, caso usuário fica em uma sessão no desktop e compartilham o mesmo hardware ao mesmo tempo. 

Legal, como fazer:

  1. Um editor de hexadecimal. (https://mh-nexus.de/en/hxd/) 
  2. Pare o serviço do Remote Desktop Net stop TermService
  3. Faça uma cópia da DLL copy c:\Windows\System32\termsrv.dll termsrv.dll_backup
  4. Vamos editar a DLL termsrv.dll

Procure pela linha:

39 81 3C 06 00 00 0F 84 3F 42 02 00

Substitua por:

B8 00 01 00 00 89 81 38 06 00 00 90

  1. Reinicie o serviço do Remote Desktop Net start TermService

Sempre vale lembrar,,, quer fazer essas alterações? É por sua conta e risco. Isso pode não funcionar em algumas versões por questões de atualização da DLL ou modificação da MS. 

Melhorando o “Abrir o prompt de comando aqui”

Categories: Powershell, TI, Windows

Não sei se é de conhecimento de todos mas, já faz alguns anos que você pode usar o SHIFT + Botão Direito e vai aparecer uma opção de “Abrir o prompt de comando aqui” e ele vai abrir uma tela do DOS dentro daquela estrutura de diretório.

A mesma coisa vale para qualquer parte vazia na janela de conteúdo.

Isso ajuda? ajuda, mas tem um detalhe chato, ele não abre o prompt elevado e mesmo nas versões mais recentes não tem a opção de powershell. Fora que para abrir tem que pressionar o SHIFT junto.

É possível melhorar isso? claro, senão não estaria escrevendo este post…

Só testei no Windows 10, se alguém testar em outras versões deixa um comentário dizendo se funcionou ou não e em qual versão.

Para isso vamos ter que adicionar algumas linhas de registro.

Sempre vale um ATENÇÃO !!! Se você não sabe alterar, ou tem medinho, de alterar o registro clique aqui.

Para os outros, abaixo tem o que vocês precisam copiar e salvar em um arquivo .reg, após importar o arquivo vocês terão 2 novos menus com o Botão Direito:


Windows Registry Editor Version 5.00

; Command Prompt

[HKEY_CLASSES_ROOT\Directory\shell\01MenuCmd]
"MUIVerb"="Command Prompts"
"Icon"="cmd.exe"
"ExtendedSubCommandsKey"="Directory\\ContextMenus\\MenuCmd"

[HKEY_CLASSES_ROOT\Directory\background\shell\01MenuCmd]
"MUIVerb"="Command Prompts"
"Icon"="cmd.exe"
"ExtendedSubCommandsKey"="Directory\\ContextMenus\\MenuCmd"

[HKEY_CLASSES_ROOT\Directory\ContextMenus\MenuCmd\shell\open]
"MUIVerb"="Command Prompt"
"Icon"="cmd.exe"

[HKEY_CLASSES_ROOT\Directory\ContextMenus\MenuCmd\shell\open\command]
@="cmd.exe /s /k pushd \"%V\""

[HKEY_CLASSES_ROOT\Directory\ContextMenus\MenuCmd\shell\runas]
"MUIVerb"="Command Prompt Elevated"
"Icon"="cmd.exe"
"HasLUAShield"=""

[HKEY_CLASSES_ROOT\Directory\ContextMenus\MenuCmd\shell\runas\command]
@="cmd.exe /s /k pushd \"%V\""
; PowerShell

[HKEY_CLASSES_ROOT\Directory\shell\02MenuPowerShell]
"MUIVerb"="PowerShell Prompts"
"Icon"="powershell.exe"
"ExtendedSubCommandsKey"="Directory\\ContextMenus\\MenuPowerShell"

[HKEY_CLASSES_ROOT\Directory\background\shell\02MenuPowerShell]
"MUIVerb"="PowerShell Prompts"
"Icon"="powershell.exe"
"ExtendedSubCommandsKey"="Directory\\ContextMenus\\MenuPowerShell"

[HKEY_CLASSES_ROOT\Directory\ContextMenus\MenuPowerShell\shell\open]
"MUIVerb"="PowerShell"
"Icon"="powershell.exe"

[HKEY_CLASSES_ROOT\Directory\ContextMenus\MenuPowerShell\shell\open\command]
@="powershell.exe -noexit -command Set-Location '%V'"

[HKEY_CLASSES_ROOT\Directory\ContextMenus\MenuPowerShell\shell\runas]
"MUIVerb"="PowerShell Elevated"
"Icon"="powershell.exe"
"HasLUAShield"=""

[HKEY_CLASSES_ROOT\Directory\ContextMenus\MenuPowerShell\shell\runas\command]
@="powershell.exe -noexit -command Set-Location '%V'"
; Ensure OS Entries are on the Extended Menu (Shift-Right Click)

[HKEY_CLASSES_ROOT\Directory\shell\cmd]
"Extended"=""

[HKEY_CLASSES_ROOT\Directory\background\shell\cmd]
"Extended"=""

[HKEY_CLASSES_ROOT\Directory\shell\Powershell]
"Extended"=""

[HKEY_CLASSES_ROOT\Directory\background\shell\Powershell]
"Extended"=""

Ativando um Windows trial

Categories: TI, Windows

As vezes é legal voltar a trabalhar um pouco com outras coisas além de SQL Server,,,

Essa semana fiz uma consultoria em Active Directory,,,, Fui resolver alguns problemas de replicação e configurar um novo domain controler para replicação,,,

Até aí nenhum grande problema,,, o cliente já havia instalado o SO (Windows Server 2012R2),,, atualizei o SO, alteramos o nome, adicionando ao domínio,,, até aí tudo tranquilo,,,

O problema: o cliente havia instalado o SO na versão trial de 180 dias,,, quando tentamos registrar o Windows ele informava que o número de série não era compatível com a versão instalada,,,

Em contato com o time de suporte da MS eles informaram que a única opção era reinstalar o SO na versão correta,,, o que na teoria não estava errado,,, mas sempre tem um jeito,,,,

Caso você tenha instalado um SO trial e queira registra-lo como full faça o seguinte:

  1. Abra o prompt em modo elevado e digite  dism /online /get-targeteditions
  2. Ele vai te mostrar para quais versões você pode elevar a instalação atual,,,
  3. Tenha em mãos com o serial da versão que você quer usar
  4. Agora digite:  DISM /online /Set-Edition:ServerStandard /ProductKey:XXXXX-XXXXX-XXXXX-XXXXX-XXXXX /AcceptEula Onde neste caso a edição é para qual queremos registrar este SO e o xxxx é o número de série,,,
  5. Se você fez certo será apresentada uma mensagem de erro,,,, Error 87
  6. Você não tem como forçar um upgrade de versão usando um serial que nao seja de KMS,,, haha pegadinha do malandro,,,
  7. Entre nesse site https://technet.microsoft.com/en-us/library/jj612867.aspx e copie o serial correto para sua versão,,,
  8. Substitua o xxxxx por esse serial e agora sim vai funcionar,,, só que ele não avisa que vai reiniciar,,, provavelmente ele deve reiniciar umas 2x
  9. Após isso, você deve conseguir ativar seu Windows com onseu serial sem problemas,,,

Caso não funcione sempre tem a opção do backup, reinstalar certo dessa vez e restore,,,

Coisas que só o Powershell ISE faz por você

Categories: Powershell, Windows

Tenho alguns clusters que estão em Multi-site, usando um Quorum em File Share para melhorar a disponibilidade.

Como o “Cluster Core” conta como voto na contagem do cluster, tenho preferencia na localização do recurso, já que todos os nós estão votando ele trabalha como voto de desempate.

Eu precisava monitorar um evento bem particular do cluster, quando o “Cluster Core Resource” alterasse de site ele deveria alarmar pelo SCOM, até ai tranquilo,,, faço um script no POSH o pessoal coloca para monitorar e pronto….


$API = new-object -comObject "MOM.ScriptAPI"
$bag = $api.CreatePropertyBag()
$resultado = (@(Get-ClusterGroup "Cluster Group" | Where-Object {$_.OwnerNode -like 'SERVIDOR*'}).count -eq 1)

if ($resultado -eq $true)
{
$bag.AddValue("State","Good")}
else
{
$bag.AddValue("State","Bad")}

$API.Return($bag)

Enquanto testava o script percebi que o Powershell ISE estava retornando mensagem de erro, fiquei revendo argumento, variável, comObject, mas não encontrei o erro…

Powershell ISE SCOM Script Error
Powershell ISE SCOM Script Error

Exception calling “Return” with “1” argument(s): “The handle is invalid. (Exception from HRESULT: 0x80070006 (E_HANDLE))”
At line:15 char:1
+ $API.Return($bag)
+ ~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ComMethodTargetInvocation

A solução é bem simples:

  • Salve o arquivo em script e execute ele… o ISE não consegue interpretar o retorno do comObject.

O retorno é alguma coisa como:

<DataItem type=”System.PropertyBagData” time=”2015-06-24T12:18:40.1270337-03:00″ sourceHealthServiceId=”68A1F050-F975-9EE7-E0F3-C2CDE3445FD3″><Property Name=”State” VariantType=”8″>Bad</Property></DataItem>

Testar Porta

Categories: Uncategorized

Vocês sabem que se quiser testar uma porta TCP um dos métodos mais simples é basicamente um telnet Nome/IP porta.
Se o prompt sumir e o cursor ficar piscando a porta está respondendo (claro,, tirando todas as implicações de liberação de firewall e blá blá blá)
Eu precisava ficar fazendo um teste mais dinâmico, já que o telnet estabelece a conexão e espera uma intervenção para continuar eu queria apenas saber se a porta esta aberta ou não, estávamos tentando identificar uma falha se era no serviço ou na rede.open door
o script abaixo fica estabelecendo uma comunicação em um intervalo definido usando o socket TCP/IP estão podemos testar TCP e UDP bem no nível da camada e não da aplicação.
ele é bem simples, em qualquer momento que a porta não responda ele coloca a cor de fundo como vermelho.

function TestPort
{
    Param(
        [parameter(ParameterSetName='ComputerName', Position=0)]
        [string]
        $ComputerName,

        [parameter(ParameterSetName='IP', Position=0)]
        [System.Net.IPAddress]
        $IPAddress,

        [parameter(Mandatory=$true , Position=1)]
        [int]
        $Port,

        [parameter(Mandatory=$true, Position=2)]
        [ValidateSet(&quot;TCP&quot;, &quot;UDP&quot;)]
        [string]
        $Protocol
        )

    $RemoteServer = If ([string]::IsNullOrEmpty($ComputerName)) {$IPAddress} Else {$ComputerName};

    If ($Protocol -eq 'TCP')
    {
        $test = New-Object System.Net.Sockets.TcpClient;
        Try
        {
            Write-Host &quot;Connecting to &quot;$RemoteServer&quot;:&quot;$Port&quot; (TCP)..&quot;;
            $test.Connect($RemoteServer, $Port);
            Write-Host &quot;Connection successful&quot; -BackgroundColor Green;
        }
        Catch
        {
            Write-Host &quot;Connection failed&quot; -BackgroundColor Red;
        }
        Final
        {
            $test.Dispose();
        }
    }

    If ($Protocol -eq 'UDP')
    {
        $test = New-Object System.Net.Sockets.UdpClient;
        Try
        {
            Write-Host &quot;Connecting to &quot;$RemoteServer&quot;:&quot;$Port&quot; (UDP)..&quot;;
            $test.Connect($RemoteServer, $Port);
            Write-Host &quot;Connection successful&quot; -BackgroundColor Green;
        }
        Catch
        {
            Write-Host &quot;Connection failed&quot; -BackgroundColor Red;
        }
        Final
        {
            $test.Dispose();
        }
    }
}

A forma de testar ele é bem simples:

TestPort -ComputerName Nome/IP -Port 1433 -Protocol TCP 

Legal né? só que eu precisava ficar fazendo testes direto e reto e da forma acima ele não é um looping…
logo, para fazer da forma mais simples que conheço ficou assim:

$servidor = &quot;Nome/IP&quot;
while (1) {
    get-date #só pra saber quando executou
    TestPort -ComputerName $servidor -Port 1433 -Protocol TCP 
    sleep -seconds 1 #tempo de espera entre as execuções
}