Как проверить процесс, работающий на определенном порту в NSIS

Я использую NSIS для разработки установщика для своего приложения. Что мне нужно сделать с этим установщиком, так это проверить, доступен ли порт 80, и если он доступен, продолжить установку, если он не выдает сообщение об ошибке с именем процесса, который работает на порту 80.

Я нашел способ проверить, доступен ли порт 80 или нет. Для этого я использовал Ports.nsh в качестве плагина. http://nsis.sourceforge.net/Check_open_ports

${If} ${TCPPortOpen} 80
 MessageBox MB_OK|MB_ICONSTOP "PORT 80 is already using by another program..."
 Abort
${EndIf}

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

//Skype is running on port 80 and close Skype to continue with the installation. 

Может кто-нибудь, пожалуйста, помогите мне в этом. Спасибо.


person Thilanka    schedule 26.04.2012    source источник


Ответы (1)


Поскольку я не смог найти подходящего способа сделать это в nsis, я просто использовал VBScript для проверки имени процесса и вызвал его через скрипт nsis. Ниже приведен код.

//TestPort80.vbs

Dim WshShell, oExec, key
Set WshShell = CreateObject("WScript.Shell")
Set oExec = WshShell.Exec("netstat -o -n -a")
key = "0.0:80"

Dim values
values = checkPortStatus(oExec, key)
portInUse = values(0)
input = values(1)

If portInUse Then
  x = InStrRev(input, " ")

  ProcessID = Mid(input, x+1)

  commandTxt = "tasklist /FI " & Chr(34) & "PID eq " & ProcessID & Chr(34)

Dim oExec2, key2
Set oExec2 = WshShell.Exec(commandTxt)
key2 = ProcessID

Dim values2
values2 = checkPortStatus(oExec2, key2)
Found = values2(0)
input2 = values2(1)

If Found Then
    y = InStr(input2, " ")
    ExeName = Left(input2, y-1)
        WScript.StdOut.WriteLine "Port 80 is using by " & ExeName
End If
End If
'## If we explicitly set a Success code then we can avoid this.
WScript.Quit 512

Function checkPortStatus(oExec, key)
portInUse = false
input = ""
Do While True

     If Not oExec.StdOut.AtEndOfStream Then
          input = oExec.StdOut.ReadLine()
          If InStr(input, key) <> 0 Then 
        ' Found Port 80
                portInUse = true
                Exit DO
          End If
     Else
        Exit DO
     End If
     WScript.Sleep 100
Loop

Do While oExec.Status <> 1
 WScript.Sleep 100
Loop
Dim values(1)
values(0) = portInUse
values(1) = input

checkPortStatus = values

End Function

//Installer.nsi

${If} ${TCPPortOpen} 80
 GetTempFileName $0
     File /oname=$0 `TestPort80.vbs` 
     nsExec::ExecToStack `"$SYSDIR\CScript.exe" $0 //e:vbscript //B //NOLOGO`
 Pop $0
 Pop $1
 MessageBox MB_OK|MB_ICONSTOP '$1'
 Abort
${EndIf}
person Thilanka    schedule 27.04.2012