Ir para conteúdo
Fórum Script Brasil
  • 0

Fechar Programas


Geovani

Pergunta

Olá Pessoal!!

Feliz ano novo!!!

Um dúvida, Eu tenho um programa na minha máquina que é executado por mim e por outras máquinas na rede.

Queria criar um botão aonde eu posso derrubar todos que estão usando o executável da minha máquina, isso é possível?

Eu vi na net que tem como derrumar os programas da minha máquina, mas executados por mim, será que tem como derrubar os programas da minha máquina executados por outro micro?

Abraço!

Link para o comentário
Compartilhar em outros sites

11 respostass a esta questão

Posts Recomendados

  • 0

É possivel sim amigo, posso lhe dar um dica.

use uma tabela no seu banco de dados que armazene o ip ou nome do computador conectado ao banco.

Agora faça um app servidor que liste todos da conexao respectiva na tabela, por um dbgrid, crie os botoes para apagar registros selecionados no dbgrid.

Depois disso no programa que está sendo executado por varias maquinas acresente um timer que verifique se a maquina ainda está na tabela por ip ou nome do computador se não tiver faça com que o timer finalize o app com o comando " halt ". Voce pode tambem usar APIs do windows mais se torna um pouco mais complicado. valeu...

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Eder

Boa dica,

Mas tem um problema, se o usuário der apenas um logoff, a conexão com o banco será encerrada, mas ainda o executável estará aberto.

Tive a segunite idéia, peguei na net uma função que retorna os ips da rede e joga em um memo.

Depois executei o seguinte comando:

WinExec(PCHAR('taskkill /S '+Memo1.lines.Strings[i]+' /U "DOMINIO\usuario" /P "SENHA" /F /IM '+edit1.Text+' /T'),SW_SHOWNORMAL); 

Com esse comando eu consigo fechar os programas que quero, mas o problema é que ele tenta fechar em todos os ips da rede.

Alguém sabe se tem como eu saber, por exemplo, quais os ips que estão com um arquivo aberto da minha maquina?

Sabendo, eu não preciso executar o comando em toda a rede, o que demora muito.

Valeu!!!

Link para o comentário
Compartilhar em outros sites

  • 0
Um dúvida, Eu tenho um programa na minha máquina que é executado por mim e por outras máquinas na rede.

Queria criar um botão aonde eu posso derrubar todos que estão usando o executável da minha máquina, isso é possível?

Geovani, por este questionamento, entendo que você quer interromper a execução de qualquer programa (executável) que seja iniciado, via rede, na sua máquina.

É isto mesmo ou seria, como no caso da sugestão do colega Eder Moraes, um programa seu que acessa uma base de dados em seu computador?

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Opa!!

Seria a primeira:

"Geovani, por este questionamento, entendo que você quer interromper a execução de qualquer programa (executável) que seja iniciado, via rede, na sua máquina."

Tem como saber, por exemplo, quem da rede WINNT está com o executável SISTEMA.exe aberto?

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Geovani, neste caso acredito que não seja possível.

Não sei como lhe explicar isso adequadamente, mas que eu saiba, como o programa tem que ser carregado para a memória para ser executado, ele estará rodando na máquida do usuário que o chamou. Na pior das hipóteses, ele poderá manter algum arquivo aberto no local de origem (que seria sua máquina), mas isso seria uma partigularidade da aplicação (este seria o caso em que você consegue, no gerenciador do windows, saber que arquivos estão em uso em seu computador - não programas rodando e por quem).

Espero que outro colega possa explicar-lhe melhor isso ou corrigir-me se estiver enganado.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Obrigado pela atenção Micheus! valeu mesmo!!

Estava vendo em Painel de Controle >> Ferramentas Administrativas >> Gerenciamento do Computador >> Pastas Compartilhadas >> Arquivos Abertos, que tem como ver qual o usuário e os arquivos da minha maquina que estão abertos por esse usuário.

Se pudesse implementar no delphi essa consulta creio resolveria meu problema..

alguém sabe se tem como?

Link para o comentário
Compartilhar em outros sites

  • 0
Obrigado pela atenção Micheus! valeu mesmo!!

Estava vendo em Painel de Controle >> Ferramentas Administrativas >> Gerenciamento do Computador >> Pastas Compartilhadas >> Arquivos Abertos, que tem como ver qual o usuário e os arquivos da minha maquina que estão abertos por esse usuário.

Se pudesse implementar no delphi essa consulta creio resolveria meu problema..

alguém sabe se tem como?

Geovani, esta informação pode ser obtida via função da API NetFileEnum, mas a função, assim como via o painel de controle, só lhe retornará algo se você tiver direitos de administrador, do contrário você obterá um "Acces denied" (acesso negado). Também há um detalhes referentes às versões do Windows - este post do Churc vale para esta função também.

Pesquisando no Google: get users with open file on machine, o 2º link aponta para uma versão em VB (fácil de ler e converter, caso lhe enteresse)

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Geovani, eu não tenho conta de administrador aqui para testar, foi onde implementei o teste, então, vou botar o código e você vê se consegue algo.

Vou por só o .pas, então no seu form para teste, adicione um TListBox e um TButton:

unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    ListBox1: TListBox;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  NetAPIStatus = Integer;

  PFILE_INFO_3 = ^FILE_INFO_3;
  FILE_INFO_3 = record
    fi3_id: Integer;
    fi3_permissions: Integer;
    fi3_num_locks: Integer;
    fi3_pathname: PWideChar;
    fi3_username: PWideChar
  end;

function  NetFileEnum(serverName, basePath, userName: PWideChar;
                      level: DWORD;
                      var bufPtr: PWideChar;
                      prefmaxlen: DWORD;
                      entriesread, totalentries :LPDWORD;
                      var resumeHandle :DWORD
                      ): NetAPIStatus; stdcall;

function NetApiBufferFree(buffer: Pointer): NetAPIStatus; stdcall;

const
  MAX_PREFERRED_LENGTH  = DWORD(-1);
  NERR_Success          = 0;

var
  Form1: TForm1;

implementation
{$R *.DFM}

function NetFileEnum; stdcall external 'NETAPI32.DLL';
function NetApiBufferFree; stdcall external 'NETAPI32.dLL';

procedure ListFiles(const server, user :string; list :TStrings);
var
  wUser,
  wServer :WideString;
  err, i,
  nil_HANDLE,
  entriesRead,
  totalEntries :DWORD;
  buffer :PWideChar;
  info :PFILE_INFO_3;
begin
  wUser := user;
  wServer := server;
  err := NetFileEnum(
    nil,                                          //    PWideChar(wServer),
    nil,
    nil,                                          //    PWideChar(wUser),
    3,
    buffer,
    MAX_PREFERRED_LENGTH,
    @entriesRead,
    @totalEntries,
    nil_HANDLE);

  if err = NERR_Success then
  try
    info := PFILE_INFO_3(buffer);
    for i := 0 TO entriesRead - 1 DO
      begin
        list.Add(info^.fi3_pathname);
        Inc(info)
      end
  finally
    NetAPIBufferFree(buffer)
  end
  else
    raise Exception.CreateFmt('Error %d enumerating files', [err])
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ListFiles('', '', ListBox1.Items);
end;

end.

Link para o comentário
Compartilhar em outros sites

  • 0

Aprensenta o seguinte erro:

---------------------------

Project1

---------------------------

Access violation at address 00441026 in module 'Project1.exe'. Read of address 0000000C.

---------------------------

OK

---------------------------

No evento do Button1.onclick primeiramente testei:

ListFiles('', '', ListBox1.Items);

Depois :

ListFiles(PCGEOVANI, geovani, ListBox1.Items);

Nas duas tentativas apareceu a MSN de erro acima.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...