none
api do windows c# RRS feed

  • Pergunta

  • olá,

    minha duvida e o seguinte estou fazendo um programa de monitoramento de usuarios para empresa onde trabalho sou do setor de ti de la e meu chefe esta pedido que tenho um relatorio de tudo que as pessoas estao fazendo abrindo etc ...

    minhas duvidas e o seguinte vou postar varias duvidas e se responder alguma agradeço !!!

    1- eu queria buscar os nomes de todos os softwares abertos e arquivos tipo abri o teste.doc ai quero q o software executando em segundo plano grave isso se abrir teste1.exe grave tambem .... assim por diante ja que e coisa de segundo plano teria q usar api do windows os dll import qual e o comando que busca isso qual dll e como usa sou pessimo com api do windows 

    2- duvida como fasso para bloquear certos programas tipo o "jogo.exe" como bloqueio isso com a api do windows

    3-como detectar todas urls acessadas independente do navegador pela api do windows acho

    4-o mais dificil acho tipo vai ter uma lista de nomes gravados tipo "playboy....." varios nomes ai quero q o software detecte quando o usuario escreve essas palavras acho q ele vai ter q interder semantica coisa do tipo nao sei como fazer tb :/

    obrigado por ler tudo  !!!

    agradecido nt10k 

    sábado, 16 de março de 2013 02:42

Respostas

  • Bom dia.

    Segue outra opção por API, como você havia pedido.

    Essa pega o titulo das janelas então voce pode fazer o que estava pensando, por exemplo fechar o site que ta escrito playboy no topo.

            [DllImport("user32.dll")]
            static extern bool EnumDesktopWindows(IntPtr hDesktop,
            EnumWindowsProcDelegate lpfn, IntPtr lParam);
    
            [DllImport("user32.dll", CharSet = CharSet.Auto)]
            static extern int GetWindowText(IntPtr hWnd, [Out] StringBuilder lpString, int nMaxCount);
    
            [DllImport("user32.dll")]
            private static extern int SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
    
            private const uint WM_CLOSE = 0x10;
    
            [DllImport("user32.dll")]
            static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    
            public delegate bool EnumWindowsProcDelegate(IntPtr hwnd, IntPtr lParam);
    
            private string temp;
    
            private List<string> NomeTelas = new List<string>();
        
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                EnumWindowsProcDelegate del = new EnumWindowsProcDelegate(EnumWindowsProc);
                if (EnumDesktopWindows(IntPtr.Zero, del, IntPtr.Zero))
                { 
                    // Aqui voce tera todas os nomes das telas abertas dentro da lista NomeTelas.
    
                    //Para fechar a tela voce pode usar assim
    
                    IntPtr handle = FindWindow(null, NomeTelas[40]); //Sendo que o NomeTelas[0], e a tela que voce quer fechar
                    SendMessage(handle, WM_CLOSE, new IntPtr(0), new IntPtr(0));
    
                }
            }
            private bool EnumWindowsProc(IntPtr hwnd, IntPtr lParam)
            {
                
                // Obtém o título da janela.
                StringBuilder sbWindowText = new StringBuilder(255); //tam + 1);
                GetWindowText(hwnd, sbWindowText, sbWindowText.Capacity);
    
                // Armazena o título e o handle da janela
                // nnum novo objeto janela.
                temp = sbWindowText.ToString();
                if(!string.IsNullOrEmpty ( temp))  NomeTelas.Add(temp);
    
                return true; // Continua a iteração até a última janela.
            }
    Espero ter conseguido me expressar bem. 
    sábado, 16 de março de 2013 11:40
  • Cara,

    1º - Existe a classe Process onde você consegue pegar todos os processos abertos:

                Process[] pProcesso = Process.GetProcesses();
    
                for (int i = 0; i < pProcesso.Length; i++)
                {
                        pProcesso[i].Name;
                } 

    Exemplo matando processos:

    http://social.msdn.microsoft.com/Forums/pt-BR/504/thread/97820e27-631c-44e3-b23b-800ee7b5ff60

    2º- Porque criar um software se o windows já gerencia isso?

    Obs.

    Impossível de você saber o nome do executável que o cara está tentando executar, pois ele pode renomear para Importante.exe, etc.. você tem como gerenciar isso a não ser pelo próprio windows(Contas de usuário) e ferramentas para gerenciar o seu ambiente.

    3º e 4º - Vocês precisam aplicar politicas de segurança dentro da empresa, não vai ser um software qualquer criado que vai gerenciar isso e sim, switch, roteadores, firewall e toda parte de infraestrutura para gerenciar a rede e o controle dela com as devidas ferramentas que já existem no mercado.


    Atenciosamente, Samuel dos Anjos

    sábado, 16 de março de 2013 03:42

Todas as Respostas

  • Cara,

    1º - Existe a classe Process onde você consegue pegar todos os processos abertos:

                Process[] pProcesso = Process.GetProcesses();
    
                for (int i = 0; i < pProcesso.Length; i++)
                {
                        pProcesso[i].Name;
                } 

    Exemplo matando processos:

    http://social.msdn.microsoft.com/Forums/pt-BR/504/thread/97820e27-631c-44e3-b23b-800ee7b5ff60

    2º- Porque criar um software se o windows já gerencia isso?

    Obs.

    Impossível de você saber o nome do executável que o cara está tentando executar, pois ele pode renomear para Importante.exe, etc.. você tem como gerenciar isso a não ser pelo próprio windows(Contas de usuário) e ferramentas para gerenciar o seu ambiente.

    3º e 4º - Vocês precisam aplicar politicas de segurança dentro da empresa, não vai ser um software qualquer criado que vai gerenciar isso e sim, switch, roteadores, firewall e toda parte de infraestrutura para gerenciar a rede e o controle dela com as devidas ferramentas que já existem no mercado.


    Atenciosamente, Samuel dos Anjos

    sábado, 16 de março de 2013 03:42
  • oi

    aqui obrigado pela resposta mas e o seguinte o do process eu ja sabia so que e o seguinte como vou pegar o evento de abrir o programa ? vou ter q fazer um loop e isso vai consumir o pc 

    2- a questao de roteadores firewall enfim tudo isso ja tem na empresa o acesso ao sites ja e bloqueado pelo proxy e ja e gerenciado cada um tem sua conta de usuario que conecta ao servidor a parte de segurança ta feita a questao do software e fazer relatorio disso para a diretoria serve mais para isso 

    sábado, 16 de março de 2013 11:09
  • Bom dia.

    Segue outra opção por API, como você havia pedido.

    Essa pega o titulo das janelas então voce pode fazer o que estava pensando, por exemplo fechar o site que ta escrito playboy no topo.

            [DllImport("user32.dll")]
            static extern bool EnumDesktopWindows(IntPtr hDesktop,
            EnumWindowsProcDelegate lpfn, IntPtr lParam);
    
            [DllImport("user32.dll", CharSet = CharSet.Auto)]
            static extern int GetWindowText(IntPtr hWnd, [Out] StringBuilder lpString, int nMaxCount);
    
            [DllImport("user32.dll")]
            private static extern int SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
    
            private const uint WM_CLOSE = 0x10;
    
            [DllImport("user32.dll")]
            static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    
            public delegate bool EnumWindowsProcDelegate(IntPtr hwnd, IntPtr lParam);
    
            private string temp;
    
            private List<string> NomeTelas = new List<string>();
        
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                EnumWindowsProcDelegate del = new EnumWindowsProcDelegate(EnumWindowsProc);
                if (EnumDesktopWindows(IntPtr.Zero, del, IntPtr.Zero))
                { 
                    // Aqui voce tera todas os nomes das telas abertas dentro da lista NomeTelas.
    
                    //Para fechar a tela voce pode usar assim
    
                    IntPtr handle = FindWindow(null, NomeTelas[40]); //Sendo que o NomeTelas[0], e a tela que voce quer fechar
                    SendMessage(handle, WM_CLOSE, new IntPtr(0), new IntPtr(0));
    
                }
            }
            private bool EnumWindowsProc(IntPtr hwnd, IntPtr lParam)
            {
                
                // Obtém o título da janela.
                StringBuilder sbWindowText = new StringBuilder(255); //tam + 1);
                GetWindowText(hwnd, sbWindowText, sbWindowText.Capacity);
    
                // Armazena o título e o handle da janela
                // nnum novo objeto janela.
                temp = sbWindowText.ToString();
                if(!string.IsNullOrEmpty ( temp))  NomeTelas.Add(temp);
    
                return true; // Continua a iteração até a última janela.
            }
    Espero ter conseguido me expressar bem. 
    sábado, 16 de março de 2013 11:40
  • esse codigo me ajudou nessa duvida de site obrigado !
    sábado, 16 de março de 2013 13:00