ZBLOG

golang 通过代码获取IIS监听的端口

在 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,然后获取服务信息和监听的端口信息,最后输出端口号。如果查询失败或未找到对应的信息,则会输出错误信息。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=4207

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?