3 / 3 / 2
Регистрация: 19.11.2019
Сообщений: 130
1

Сопоставить службу и сетевой порт который она использует

10.07.2024, 10:44. Показов 492. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго дня, уважаемые форумчане!

Бьюсь над задачкой: из леса АД, нужно получить список серверов, и их служб Windows, использующих заданный список сетевых портов, с выводом вида:
Имя-Сервера:ServerName, Служба:Service, Порт:PortNumber .

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

Но все, что получилось вытащить атрибуты служб скриптом:
PowerShell
1
2
$computer = ServerName
Get-WmiObject Win32_Service -ComputerName $computer
вывод отображает все службы сервера ServerName вида:
PowerShell
1
2
3
4
5
6
ExitCode  : 1077
Name      : AJRouter
ProcessId : 0
StartMode : Manual
State     : Stopped
Status    : OK
Но в выводе нет искомого - номера порта сетевой службы.

Прошу подсказать, как в PowerShell узнать какой сетевой порт использует служба?
А лучше поделиться ссылочкой, на faq, где такой функционал описан.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.07.2024, 10:44
Ответы с готовыми решениями:

Определить запуск программы и какой порт она использует
Есть определенная программа, которая создает определенный порт и передает данные на сервер....

Узнать PID процесса, который использует порт
Собственно сабж.

Требуется переписать данный код, который использует then и catch, в код, который использует исключительно async await
Требуется переписать данный код, который использует then и catch, в код, который использует...

кто какой "COM порт логгер" использует?
Посоветуйте, кто какой "COM порт логгер" использует? Где качнуть можно. Задача - перехватить...

16
1340 / 498 / 139
Регистрация: 20.02.2019
Сообщений: 2,507
Записей в блоге: 42
10.07.2024, 12:04 2
[nick]Vadim_PV[Vadim_PV, Мои размышления.

Открытый порт это атрибут соединения, id соединение это атрибут процесса, id процесса это атрибут запущенной службы...

Для TCP как то так, можно.

PowerShell
1
Get-CimInstance -Class Win32_Service | Where-Object ProcessId -eq (((Get-NetTCPConnection -LocalPort 443).OwningProcess | Group-Object).Name)
0
6213 / 2058 / 328
Регистрация: 10.12.2013
Сообщений: 7,075
10.07.2024, 12:27 3
nmap
0
27 / 19 / 9
Регистрация: 18.12.2023
Сообщений: 50
10.07.2024, 12:28 4
Vadim_PV, Как-то так, только нужен доступ по winrm

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
Import-Module ActiveDirectory
 
$username = "user"
$password = "pass" | ConvertTo-SecureString -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential ($username, $password)
 
$servers = Get-ADComputer -Filter * -Property Name
 
$results = @()
 
foreach ($server in $servers) {
    $serverName = $server.Name
    
    try {
        $remoteTcpConnections = Invoke-Command -ComputerName $serverName -ScriptBlock {
            Get-NetTCPConnection | Select-Object LocalAddress, LocalPort, RemoteAddress, RemotePort, State, OwningProcess
        } -Credential $credential
        
        foreach ($connection in $remoteTcpConnections) {
            $localPort = $connection.LocalPort
            $owningProcess = $connection.OwningProcess
            
            $service = Invoke-Command -ComputerName $serverName -ScriptBlock {
                param ($processId)
                Get-WmiObject -Class Win32_Service | Where-Object { $_.ProcessId -eq $processId }
            } -ArgumentList $owningProcess -Credential $credential
            
            if ($service) {
                foreach ($svc in $service) {
                    $results += [PSCustomObject]@{
                        'Имя-Сервера' = $serverName
                        'Служба' = $svc.Name
                        'Порт' = $localPort
                    }
                }
            } else {
                $results += [PSCustomObject]@{
                    'Имя-Сервера' = $serverName
                    'Служба' = 'Неизвестно'
                    'Порт' = $localPort
                }
            }
        }
    } 
}
 
$results | Format-Table -AutoSize
0
3 / 3 / 2
Регистрация: 19.11.2019
Сообщений: 130
10.07.2024, 15:05  [ТС] 5
Большое спасибо за ответы! Не ожидал такого отклика)))

Цитата Сообщение от alhaos Посмотреть сообщение
Открытый порт это атрибут соединения, id соединение это атрибут процесса, id процесса это атрибут запущенной службы...
Для TCP как то так, можно.
Как раз очень похоже, на искомое... можно ли атрибуту LocalPort задать несколько значений?

Добавлено через 50 секунд
Цитата Сообщение от volodin661 Посмотреть сообщение
nmap
если c PS не совладаю, то попробую эту программку.

Добавлено через 1 минуту
Цитата Сообщение от Van_Darkholme Посмотреть сообщение
Как-то так, только нужен доступ по winrm
А вот тут, не понял контекста, чем оперирует скрипт и откуда берет переменные.
0
1340 / 498 / 139
Регистрация: 20.02.2019
Сообщений: 2,507
Записей в блоге: 42
10.07.2024, 15:09 6
Get-NetTCPConnection

[[-LocalPort] <UInt16[]>]
Да
0
3 / 3 / 2
Регистрация: 19.11.2019
Сообщений: 130
10.07.2024, 15:15  [ТС] 7
Цитата Сообщение от alhaos Посмотреть сообщение
[[-LocalPort] <UInt16[]>]
Да
Читаю, спасибо!
0
27 / 19 / 9
Регистрация: 18.12.2023
Сообщений: 50
10.07.2024, 15:27 8
Цитата Сообщение от Vadim_PV Посмотреть сообщение
чем оперирует скрипт и откуда берет переменные.
Vadim_PV, Задаются учетные данные для использованния команд удаленно, пробегаемся по всем серверам и все tcp соединения собираем
P.s сейчас заметил что случайно catch в коде пропустил, Вот так должно быть
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
            } else {
                $results += [PSCustomObject]@{
                    'Имя-Сервера' = $serverName
                    'Служба' = 'Неизвестно'
                    'Порт' = $localPort
                }
            }
        }
    } catch {
        Write-Host "Ошибка при подключении к $serverName: $_"
    }
}
0
3 / 3 / 2
Регистрация: 19.11.2019
Сообщений: 130
10.07.2024, 15:59  [ТС] 9
Цитата Сообщение от Van_Darkholme Посмотреть сообщение
Задаются учетные данные для использованния команд удаленно, пробегаемся по всем серверам и все tcp соединения собираем
Пытаюсь выполнить ваш скрипт, получаю ошибку:
Oracle 11 SQL
1
2
3
4
5
Write-Host "Ошибка при подключении к $serverName: $_"
+                                              ~~~~~~~~~~~~
Недопустимая ссылка на переменную. За знаком : не следует допустимый знак имени переменной. Рекомендуется использовать ${}, чтобы отделить имя.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : InvalidVariableReferenceWithDrive
Цитата Сообщение от alhaos Посмотреть сообщение
[[-LocalPort] <UInt16[]>]
Да
не пойму как перечислить порты, в параметре.
0
27 / 19 / 9
Регистрация: 18.12.2023
Сообщений: 50
10.07.2024, 16:07 10
Vadim_PV,
PowerShell
1
 Write-Error "Ошибка при обработке сервера ${serverName}: $_"
0
3 / 3 / 2
Регистрация: 19.11.2019
Сообщений: 130
10.07.2024, 16:49  [ТС] 11
Цитата Сообщение от Van_Darkholme Посмотреть сообщение
Write-Error "Ошибка при обработке сервера ${serverName}: $_"
получается, ни к одному из серверов, скрипт не смог подключиться?
0
27 / 19 / 9
Регистрация: 18.12.2023
Сообщений: 50
10.07.2024, 17:00 12
Vadim_PV, Да, хотя с локальным компьютером проблем не должно быть
0
3 / 3 / 2
Регистрация: 19.11.2019
Сообщений: 130
10.07.2024, 17:11  [ТС] 13
Цитата Сообщение от alhaos Посмотреть сообщение
[[-LocalPort] <UInt16[]>]
Да
вроде бы немного разобрался.
Сейчас скрипт выглядит так:
PowerShell
1
2
$ports = "135","137","138","139","445"
Get-CimInstance -Class Win32_Service | Where-Object ProcessId -eq (((Get-NetTCPConnection -LocalPort $ports ).OwningProcess | Group-Object).Name)
Вывод выглядит логично:
Кликните здесь для просмотра всего текста
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
Get-NetTCPConnection : Не найдены объекты MSFT_NetTCPConnection со свойством "LocalPort", равным "137". Проверьте значение свойства и попробуйте еще раз.
C:\Users\USER\Desktop\NEW-FOLDER\Безымянный333.ps1:3 знак:70
+ ... bject ProcessId -eq (((Get-NetTCPConnection -LocalPort $ports ).Ownin ...
+                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (137:UInt16) [Get-NetTCPConnection], CimJobException
    + FullyQualifiedErrorId : CmdletizationQuery_NotFound_LocalPort,Get-NetTCPConnection
 
Get-NetTCPConnection : Не найдены объекты MSFT_NetTCPConnection со свойством "LocalPort", равным "138". Проверьте значение свойства и попробуйте еще раз.
C:\Users\USER\Desktop\NEW-FOLDER\Безымянный333.ps1:3 знак:70
+ ... bject ProcessId -eq (((Get-NetTCPConnection -LocalPort $ports ).Ownin ...
+                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (138:UInt16) [Get-NetTCPConnection], CimJobException
    + FullyQualifiedErrorId : CmdletizationQuery_NotFound_LocalPort,Get-NetTCPConnection

Но, в выводе упомянуты порты 138 и 137, а почему нет вывода по оставшимся портам?

Добавлено через 7 минут
Цитата Сообщение от Van_Darkholme Посмотреть сообщение
Vadim_PV, Да, хотя с локальным компьютером проблем не должно быть
сейчас скрипт выглядит так:
Кликните здесь для просмотра всего текста
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
$servers = Test-SRV 
foreach ($server in $servers) {
    $serverName = $server.Name
    
    try {
        $remoteTcpConnections = Invoke-Command -ComputerName $serverName -ScriptBlock {
            Get-NetTCPConnection | Select-Object LocalAddress, LocalPort, RemoteAddress, RemotePort, State, OwningProcess
        } -Credential $credential
        
        foreach ($connection in $remoteTcpConnections) {
            $localPort = $connection.LocalPort
            $owningProcess = $connection.OwningProcess
            
            $service = Invoke-Command -ComputerName $serverName -ScriptBlock {
                param ($processId)
                Get-WmiObject -Class Win32_Service | Where-Object { $_.ProcessId -eq $processId }
            } -ArgumentList $owningProcess -Credential $credential
            
            if ($service) {
                foreach ($svc in $service) {
                    $results += [PSCustomObject]@{
                        'Имя-Сервера' = $serverName
                        'Служба' = $svc.Name
                        'Порт' = $localPort
                    }
                }
            } else {
                $results += [PSCustomObject]@{
                    'Имя-Сервера' = $serverName
                    'Служба' = 'Неизвестно'
                    'Порт' = $localPort
                }
            }
        }
    } catch {
        Write-Host "Ошибка при подключении к $serverName: $_"
    }
}

в начале скрипта указал переменную $servers равную локальному имени сервера на котором выполняю скрипт.
Ошибка та же
0
1340 / 498 / 139
Регистрация: 20.02.2019
Сообщений: 2,507
Записей в блоге: 42
10.07.2024, 17:26 14
Vadim_PV, По умолчанию коммандлет выдает ошибку если не нашел соединение по этому порту

PowerShell
1
2
$ports =  9999, 9998, 443, 80
Get-CimInstance -Class Win32_Service | Where-Object ProcessId -eq (((Get-NetTCPConnection -LocalPort $ports -ErrorAction SilentlyContinue).OwningProcess | Group-Object).Name)
0
3 / 3 / 2
Регистрация: 19.11.2019
Сообщений: 130
10.07.2024, 17:52  [ТС] 15
Цитата Сообщение от alhaos Посмотреть сообщение
По умолчанию коммандлет выдает ошибку если не нашел соединение по этому порту
Это понял, по ошибке.
Задаем порт 135, вывод:
Кликните здесь для просмотра всего текста
PowerShell
1
2
3
4
5
6
 Get-CimInstance -Class Win32_Service | Where-Object ProcessId -eq (((Get-NetTCPConnection -LocalPort 135 -ErrorAction SilentlyContinue).OwningProcess | Group-Object).Name)
 
ProcessId Name         StartMode State   Status ExitCode
--------- ----         --------- -----   ------ --------
1508      RpcEptMapper Auto      Running OK     0
1508      RpcSs        Auto      Running OK     0

Задаем порт 140 и получаем ошибку:
Кликните здесь для просмотра всего текста
PowerShell
1
2
3
4
5
6
7
Get-NetTCPConnection : Не найдены объекты MSFT_NetTCPConnection со свойством "LocalPort", равным "140". Проверьте значе
ние свойства и попробуйте еще раз.
строка:1 знак:70
+ ... e-Object ProcessId -eq (((Get-NetTCPConnection -LocalPort 140 ).Ownin ...
+                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (140:UInt16) [Get-NetTCPConnection], CimJobException
    + FullyQualifiedErrorId : CmdletizationQuery_NotFound_LocalPort,Get-NetTCPConnection


Задаем порт 139 и вывод пустой:
Код
PS C:\Windows\system32> Get-CimInstance -Class Win32_Service | Where-Object ProcessId -eq (((Get-NetTCPConnection -LocalPort 139 ).OwningProcess | Group-Object).Name)
PS C:\Windows\system32>
Такое поведение наблюдается не только со 139 портом, 5357, 5985 и т.п. запустил в соседнем окне командной строки
Код
netstat  - a
и случайным образом выбирал порты.
Не ясно, почему при запросе некоторых портов нет вывода?
0
1340 / 498 / 139
Регистрация: 20.02.2019
Сообщений: 2,507
Записей в блоге: 42
10.07.2024, 18:06 16
дак что netstat выдает?
0
3 / 3 / 2
Регистрация: 19.11.2019
Сообщений: 130
11.07.2024, 12:08  [ТС] 17
Цитата Сообщение от alhaos Посмотреть сообщение
дак что netstat выдает?
Код
Имя    Локальный адрес        Внешний адрес          Состояние
  TCP    0.0.0.0:135            USER-PC:0            LISTENING
  TCP    0.0.0.0:445            USER-PC:0            LISTENING
  TCP    0.0.0.0:5040           USER-PC:0            LISTENING
  TCP    0.0.0.0:5357           USER-PC:0            LISTENING
  TCP    0.0.0.0:5985           USER-PC:0            LISTENING
  TCP    0.0.0.0:47001          USER-PC:0            LISTENING
  TCP    0.0.0.0:49664          USER-PC:0            LISTENING
  TCP    0.0.0.0:49665          USER-PC:0            LISTENING
  TCP    0.0.0.0:49666          USER-PC:0            LISTENING
  TCP    0.0.0.0:49667          USER-PC:0            LISTENING
  TCP    0.0.0.0:49668          USER-PC:0            LISTENING
  TCP    0.0.0.0:49669          USER-PC:0            LISTENING
  TCP    0.0.0.0:49670          USER-PC:0            LISTENING
  TCP    0.0.0.0:49672          USER-PC:0            LISTENING
  TCP    127.0.0.1:2577         USER-PC:0            LISTENING
  TCP    127.0.0.1:30523        USER-PC:0            LISTENING
  TCP    127.0.0.1:49671        USER-PC:0            LISTENING
  TCP    127.0.0.1:49677        USER-PC:0            LISTENING
  TCP    127.0.0.1:62522        USER-PC:0            LISTENING
  TCP    192.168.12.23:139      USER-PC:0            LISTENING
Возможно ли отсутствие вывода, когда порт открыт, но не используется?
0
11.07.2024, 12:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.07.2024, 12:08
Помогаю со студенческими работами здесь

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

Почему запуская службу, по факту она начинает работать только спустя 50 - 60 секунд?
Всем доброго времени суток, прошу у Вас помощи. Ситуация следящая: Приложение создает и запускает...

Батник, который перезапускает службу
Здравствуйте, как написать в батнике (restart.bat) чтоб он перезапускал службу. И сделать чтоб она...

Как автоматически перезагрузить зависшую службу? Например, если она грузит процессор на 400% больше 10 секунд
С Наступающим! Прошу подсказать новичку решение проблемы. Есть &quot;самописная&quot; служба, которая...

Батник, который при ошибке останавливает службу
Доброго день, столкнулся с проблемой,нужен батник который будет делать пинг к примеру 10.111.0.1, в...

Пробросить порт на сетевой принтер
Добрый день. Есть сетевой принтер Atol RP326 USE. IP в сети 192.168.1.87. Работает через порт...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru