TransWikia.com

Como verificar se um processo esta rodando no servidor?

Stack Overflow em Português Asked by Edu Mendonça on September 27, 2021

Pensando na nescidade de se verificar se uma certa aplicação está sendo executada no servidor, me veio a mente se tem como fazer essa verificação utilizando Delphi e se positivo como seria?

No caso, pela aplicação do lado Cliente verificar se uma outra aplicação está aberta no servidor.

No momento eu só consigo fazer essa verificação na maquina local com o código abaixo:

var
  Path: string;
  Hwnd: THandle;
begin
    // FindWindow vai procurar pela classe TApplication
    Hwnd := FindWindow('TApplication', 'AutoPub');
    // se o Handle e' 0 significa que nao encontrou
    if (Hwnd = 0) and (DataModuleGeral.tbParametrosCODESCRITORIO.AsInteger <> 0) then
    begin
      Path := ExtractFilePath(Application.ExeName);
      ShellExecute(Handle,'open',PChar('AutoPub.exe'),'',PChar(Path),SW_SHOW);
    end;
end;

One Answer

Praticamente tudo tem um jeito huahuahua

Existe um protocolo chamado SNMP(Simple Network Management Protocol) utilizamos esse protocolo para monitorar máquinas remotas, com ele é possível pegar informações como:

  • Tráfego de rede
  • Espaço no hd
  • Processamento
  • Memória em uso
  • Processos em uso etc

Ou seja esse protocolo é muito utilizado para gerencia de servidores e computadores, imagina um parque com 100 servidores rodando, vc acha que entramos nos 100 servidores e ficamos olhando se o HD tá lotando, se o consumo da placa de rede tá no talo, etc, etc, ??? claro que não né, criamos sistemas automáticos de alertas, um servidor client conecta via SNMP em todos os servers e fica coletando os dados a cada X minutos, se algo estiver errado, esse servidor cliente gera alertas, manda email, liga, bate tambor, etc rsrs

Então o que vc pode fazer é habilitar o snmp server no windows/linux na qual vc quer coletar o nome do programa/processo, veja aqui como isso pode ser feito no windows, feito isso seu programa terá que se conectar ao pc que vc deseja via algum client SNMP, no delphi eu sei que existe o Indy-SNMP.

Ex:

program snmptest;
{$APPTYPE Console}

uses
  SysUtils, IdBaseComponent, IdComponent, IdUDPBase, IdUDPClient, IdSNMP;

var
  Snmp: TIdSNMP;
  Idx: Integer;

begin
  Snmp := TIdSNMP.Create(nil);
  try
    Snmp.Query.Host := 'Hostname or IP'; //IP do computador que habilitou o snmp server
    Snmp.Query.Community := 'public'; // comunidade configurada no snmp server
    Snmp.Query.PDUType := PDUGetRequest;
    Snmp.Query.MIBAdd('1.3.6.1.2.1.1.1.0',''); //OID que retorna o que deseja

    if Snmp.SendQuery then
    begin
      WriteLn('Replies: ' + IntToStr(Snmp.Reply.ValueCount));
      for Idx := 0 to Snmp.Reply.ValueCount - 1 do
        WriteLn(Snmp.Reply.Value[0]);
    end;
  finally
    Snmp.Free;
  end;
end. 

Esse parâmetro Snmp.Query.MIBAdd é o OID que vc seta para colher a informação que vc quer, cada número retorna algo diferente, ou seja vai ter um OID que retorna informações de memória, OID que retorna espaço de disco, OID que retorna os programas rodando, etc, etc, etc esse OID ai do código vc terá q testar e verificar o q vai ter como retorno, dá uma pesquisada e teste o OID hrSWRunName, acho que ele retorna todos os processos rodando no windows...

Além disso se não quiser usar o Indy-SNMP instale o client executável chamado snmpwalk no computador que vai fazer a consulta no server SNMP, eu acabei de testar o OID hrSWRunName, em um PC qualquer da rede instalei o snmpwalk e usei o comando para ele mostrar o que tem rodando no servidor windows (claro esse servidor tem o serviço snmp server habilitado e configurado)...

segue comando e resultado:

snmpwalk -v 2c -c public 192.168.32.23 hrSWRunName

tive como retorno:

HOST-RESOURCES-MIB::hrSWRunName.1 = STRING: "System Idle Process"
HOST-RESOURCES-MIB::hrSWRunName.4 = STRING: "System"
HOST-RESOURCES-MIB::hrSWRunName.288 = STRING: "smss.exe"
HOST-RESOURCES-MIB::hrSWRunName.336 = STRING: "csrss.exe"
HOST-RESOURCES-MIB::hrSWRunName.360 = STRING: "winlogon.exe"
HOST-RESOURCES-MIB::hrSWRunName.408 = STRING: "services.exe"
HOST-RESOURCES-MIB::hrSWRunName.420 = STRING: "lsass.exe"
HOST-RESOURCES-MIB::hrSWRunName.576 = STRING: "svchost.exe"
HOST-RESOURCES-MIB::hrSWRunName.660 = STRING: "svchost.exe"
HOST-RESOURCES-MIB::hrSWRunName.732 = STRING: "svchost.exe"
HOST-RESOURCES-MIB::hrSWRunName.768 = STRING: "svchost.exe"
HOST-RESOURCES-MIB::hrSWRunName.784 = STRING: "svchost.exe"
HOST-RESOURCES-MIB::hrSWRunName.916 = STRING: "spoolsv.exe"
HOST-RESOURCES-MIB::hrSWRunName.940 = STRING: "msdtc.exe"
HOST-RESOURCES-MIB::hrSWRunName.1152 = STRING: "svchost.exe"
HOST-RESOURCES-MIB::hrSWRunName.1176 = STRING: "ibguard.exe"
HOST-RESOURCES-MIB::hrSWRunName.1196 = STRING: "sqlservr.exe"
HOST-RESOURCES-MIB::hrSWRunName.1252 = STRING: "svchost.exe"
HOST-RESOURCES-MIB::hrSWRunName.1304 = STRING: "snmp.exe"
HOST-RESOURCES-MIB::hrSWRunName.1608 = STRING: "WUSyncSvc.exe"
HOST-RESOURCES-MIB::hrSWRunName.1636 = STRING: "mssearch.exe"
HOST-RESOURCES-MIB::hrSWRunName.1840 = STRING: "sqlagent.exe"
HOST-RESOURCES-MIB::hrSWRunName.1876 = STRING: "svchost.exe"
HOST-RESOURCES-MIB::hrSWRunName.1896 = STRING: "ibserver.exe"
HOST-RESOURCES-MIB::hrSWRunName.2024 = STRING: "alg.exe"
HOST-RESOURCES-MIB::hrSWRunName.2172 = STRING: "wmiprvse.exe"
HOST-RESOURCES-MIB::hrSWRunName.2232 = STRING: "cmd.exe"
HOST-RESOURCES-MIB::hrSWRunName.2432 = STRING: "notepad.exe"
HOST-RESOURCES-MIB::hrSWRunName.2712 = STRING: "explorer.exe"
HOST-RESOURCES-MIB::hrSWRunName.2780 = STRING: "ctfmon.exe"
HOST-RESOURCES-MIB::hrSWRunName.2792 = STRING: "sqlmangr.exe"
HOST-RESOURCES-MIB::hrSWRunName.2864 = STRING: "svchost.exe"
HOST-RESOURCES-MIB::hrSWRunName.3980 = STRING: "isqlw.exe"

isso significa que outra opção então é vc fazer o seu delphi executar um snmpwalk e pegar o retorno do comando, tratar o retorno e comparar se o .exe que deseja está no retorno (na vdd o Indy-SNMP é um client SNMP, praticamente é um snmpwalk né, bem melhor usar o indy-snmp do que ter que ficar instalando client externo)...

Como vc pode perceber, isso pode ser perigoso, um hacker na sua rede pode descobrir qual community vc configurou nos servidores e tentar varrer sua rede procurando por portas SNMP abertas, com isso ele pode conseguir informações de serviços e programas rodando na rede, e depois tentar explorar, então quando for configurar o serviço SNMP server não esqueça de permitir que somente IP's de confiança consigam fazer consultas de somente leitura ....

Correct answer by ederwander on September 27, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP