在 Windows 操作系统上,可以通过 WMI(Windows Management Instrumentation)来获取 IIS 监听的端口。下面是一个使用 Go 语言实现的示例代码:
package main
import (
"fmt"
"github.com/StackExchange/wmi"
)
type Win32_Service struct {
Name string
DisplayName string
}
type Win32_ServerFeatureServiceRole struct {
ServiceName string
}
type Win32_WebServer struct {
Name string
ServerComment string
}
type Win32_WebServerSetting struct {
SettingName string
SettingValue uint32
}
func main() {
var serverFeatures []Win32_ServerFeatureServiceRole
q := wmi.CreateQuery(&serverFeatures, "")
err := wmi.Query(q, &serverFeatures)
if err != nil {
panic(err)
}
iisServiceName := ""
for _, feature := range serverFeatures {
if feature.ServiceName == "W3SVC" { // W3SVC 是 IIS 服务名称,用于标识 IIS 是否安装和运行。
iisServiceName = feature.ServiceName
break;
}
}
if iisServiceName == "" {
fmt.Println("IIS is not running")
return;
}
var services []Win32_Service
q = wmi.CreateQuery(&services, fmt.Sprintf("WHERE Name='%s'", iisServiceName))
err = wmi.Query(q, &services)
if err != nil || len(services) < 1 {
fmt.Println("Failed to get service information for", iisServiceName)
return;
}
var servers []Win32_WebServerSetting
q = wmi.CreateQuery(&servers, "")
err = wmi.QueryNamespace(q, &servers, "root\\WebAdministration")
if err != nil {
fmt.Println("Failed to query WebAdministration namespace")
return;
}
port := ""
for _, server := range servers {
if server.SettingName == "ServerBindings" { // ServerBindings 属性包含了 IIS 监听的端口信息。
bindingValue := server.SettingValue
ipAddress := (bindingValue & 0xFF) << 24 | ((bindingValue >> 8) & 0xFF) << 16 | ((bindingValue >> 16) & 0xFF) << 8 | ((bindingValue >> 24) & 0xFF)
port = fmt.Sprintf("%d", (bindingValue>>32)&0xFFFF)
break;
}
}
if port == "" {
fmt.Println("Failed to get IIS listening port information")
return;
}
fmt.Printf("IIS is listening on port %s\n", port)
}
这个代码中使用了 github.com/StackExchange/wmi
库来访问 WMI 接口。它首先查询系统中是否安装并运行了 IIS,然后获取服务信息和监听的端口信息,最后输出端口号。如果查询失败或未找到对应的信息,则会输出错误信息。