Служба Windows для просмотра сети - PullRequest
0 голосов
/ 31 января 2011

Мне нужно создать службу Windows для мониторинга сети (IP) и соответствующим образом изменить настройки прокси.

Служба будет установлена ​​и должна отслеживать IP-адреса, чтобы определить, является ли она внутренним или внешним IP-адресом..

Я создал базовую службу Windows, основанную на руководствах по Интернету, но я не уверен, как лучше отсюда идти.

Из руководств я заметил, что WindowsServiceУ объекта есть какая-то система событий, и я задаюсь вопросом, можно ли в нее подключиться?

Вот основной код.

using System;
using System.Diagnostics;
using System.ServiceProcess;
using System.ComponentModel;
using System.Configuration.Install;

namespace WindowsService
{
    [RunInstaller(true)]
    public class WindowsServiceInstaller : Installer
    {
        public WindowsServiceInstaller()
        {
            ServiceProcessInstaller SPI = new ServiceProcessInstaller();
            ServiceInstaller SI = new ServiceInstaller();

            //# Service Account Information
            SPI.Account = ServiceAccount.LocalSystem;
            SPI.Username = null;
            SPI.Password = null;

            //# Service Information
            SI.DisplayName = WindowsService._WindowsServiceName;
            SI.StartType = ServiceStartMode.Automatic;

            //# set in the constructor of WindowsService.cs
            SI.ServiceName = WindowsService._WindowsServiceName;

            Installers.Add(SPI);
            Installers.Add(SI);
        }
    }

    class WindowsService : ServiceBase
    {
        public static string _WindowsServiceName = "Serco External Proxy Manager";

        public WindowsService()
        {
            ServiceName = _WindowsServiceName;
            EventLog.Log = "Application";

            // These Flags set whether or not to handle that specific
            // type of event. Set to true if you need it, false otherwise.
            CanHandlePowerEvent = true;
            CanHandleSessionChangeEvent = true;
            CanPauseAndContinue = true;
            CanShutdown = true;
            CanStop = true;
        }

        static void Main()
        {
            ServiceBase.Run(new WindowsService());
        }

        protected override void OnStart(string[] args)
        {
            base.OnStart(args);
        }

        protected override void OnStop()
        {
            base.OnStop();
        }

        protected override void OnPause()
        {
            base.OnPause();
        }

        protected override void OnContinue()
        {
            base.OnContinue();
        }
    }
}

Любая помощь приветствуется

Ответы [ 3 ]

1 голос
/ 31 января 2011

Мне тоже неясно, как изменить настройки прокси, но что касается мониторинга самой сети, думаю, я могу помочь с этим.

Для мониторинга IP-трафика в сети вы 'Я захочу создать «сырой» (или разнородный) сокет.Вы должны иметь права администратора на локальном блоке для создания такого сокета, но пока ваша служба Windows работает под системной учетной записью, у вас должно быть все в порядке (кстати, именно это я и делаю в моем случае).

Чтобы создать необработанный сокет, сделайте что-то вроде этого:

using System.Net.Sockets;
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
s.Bind(new IPEndPoint(IPAddress.Parse("192.168.0.1"), 0)); // use your local IP
byte[] incoming = BitConverter.GetBytes(1);
byte[] outgoing = BitConverter.GetBytes(1);
s.IOControl(IOControlCode.ReceiveAll, incoming, outgoing);
s.ReceiveBufferSize = 8 * 1024 * 1024;  // 8MB

Теперь вы можете использовать этот сокет для получения всех входящих и исходящих IP-пакетов на указанный локальный IP-адрес.

В вашей службе Windows добавьте следующие поля:

using System.Threading;
private ManualResetEvent _shutdownEvent = new ManualResetEvent(false);
private Thread _thread;
private Socket _socket;

В обратном вызове OnStart() вашей службы Windows создайте поток, который будет выполнять эту работу:

protected override void OnStart(string[] args)
{
    _thread = new Thread(delegate() {
        // Initialize the socket here
        while (!_shutdownEvent.WaitOne(0)) {
            // Receive the next packet from the socket
            // Process packet, e.g., extract source/destination IP addresses/ports
            // Modify proxy settings?
        }
        // Close socket
    });
    _thread.Name = "Monitor Thread";
    _thread.IsBackground = true;
    _thread.Start();
}

При обратном вызове OnStop() службы Windows вам нужно сообщить о завершении потока:

protected override void OnStop()
{
    _shutdownEvent.Set();
    if (!_thread.Join(3000)) { // give the thread 3 seconds to stop
        _thread.Abort();
    }
}

Надеюсь, этого достаточно для начала работы.

0 голосов
/ 31 января 2011

Вам необходимо определить ту часть, с которой у вас возникли проблемы, и сформулировать ее как конкретный вопрос.

Вот что в вашем списке TODO:

  1. Определение IP-адресовмашины (их может быть много) и определиться с ними
  2. Изменить настройки прокси-сервера (предположительно настройки прокси-сервера Internet Explorer?)
  3. Интегрировать эту функцию в службу Windows, возможно, используяфоновая тема

Из вашего вопроса непонятно, что вы уже пробовали, возможно, вы могли бы привести пример проблемы, с которой вы столкнулись, что вы пытались решить, икто-то сможет оказать некоторую помощь.

0 голосов
/ 31 января 2011

Не уверен насчет изменения настроек прокси, но для мониторинга вам нужно будет использовать WMI .

...