Проверьте, назначен ли порт какой-либо программе или добавлен в брандмауэр - C # - PullRequest
0 голосов
/ 22 сентября 2011

У нас есть служба Windows, которая будет установлена ​​установщиком.У нас есть возможность разрешить пользователю указывать номер порта и выбирать, должна ли служба запускаться после завершения установки.У нас проверяется сам установщик для проверки, открыт ли порт / доступен.

TcpClient TcpScan = new TcpClient();
TcpScan.Connect("localhost", portno);
if (TcpScan.Connected == true)
{
   TcpScan.Close();
}

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

Так есть ли способ проверить, предоставлен ли порт пользователемуже есть в брандмауэре или уже назначен какой-либо другой службе Windows?(Также предположим, что служба может быть в остановленном состоянии)

Ответы [ 2 ]

0 голосов
/ 15 июля 2012

Наконец получил ответ, выполнив некоторые исследования и разработки

string OP = @"C:\Windows\Temp\ExceptionList.txt";

ProcessStartInfo procStartInfo = null;

string command = "netsh advfirewall firewall show rule name=all > " + OP;
procStartInfo = new ProcessStartInfo("cmd", "/c " + command);

procStartInfo.CreateNoWindow = true;
procStartInfo.WindowStyle = ProcessWindowStyle.Hidden;

System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo = procStartInfo;
proc.Start();
proc.WaitForExit();

if (File.Exists(OP))
{
    StreamReader SR = new StreamReader(OP);
    string FileData = SR.ReadToEnd();
    SR.Close();

    //Logic to read the output and then fetch only records which are enabled and have LocalPort
}

Выходной файл (ExceptionList.txt) содержит данные в этом формате

Rule Name:                            NETTCP
---------------------------------------------
Enabled:                              Yes
Direction:                            In
Profiles:                             Domain
Grouping:                             
LocalIP:                              Any
RemoteIP:                             Any
Protocol:                             TCP
LocalPort:                            8080
RemotePort:                           Any
Edge traversal:                       No
Action:                               Allow
0 голосов
/ 22 сентября 2011

Я думаю, нет, потому что любое приложение может открыть порт во время выполнения.
Вы можете (например) использовать Mutex, чтобы избежать нескольких экземпляров вашей службы на одном и том же порту (давая мьютексу имя, подобное String.Format(MyMutex_{0},my_port}.
И вы можете / должны проверить, является ли этот порт свободным во время запуска службы, и аккуратно закрыть его, если это не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...