VB中通过WMI控制DNS服务器,可在ASP中调用

在VB中要使用Scripting API for WMI,必须引用 Microsoft WMI Scripting V1.1 Library

下面介绍Scripting API For WMI的几个对象

SWbemLocator——用于取得SWbemServices对象,他代表了本地或远程计算机上名字空间的一个连接。
SWbemService——代表名字空间的一个连接,可用于处理它的部件
SWbemObject——代表一个单独的类定义或一个对象实例
SWbemOjbectSet——包括SWbemObject的集合

下面是DNS WMI Provider的几个对象
MicrosoftDNS_Zone——用于管理DNS服务器上的区域的类
MicrosoftDNS_AType,MicrosoftDNS_CNAMEType,MicrosoftDNS_MXType等等——管理DNS Server上的各种资源记录

详细的参考请见MSDN,我用的是VS.NET2003带的MSDN
Scripting API for WMI的路径是   MSDN Library--设置和系统管理--Windows Management Instrumentation(WMI)--SDK文档--WMI Reference--Scripting API For WMI

DNS WMI Provider的路径是  MSDN Library--网络和目录服务--域名系统(DNS)--SDK文档--DNS WMI Provider--DNS WMI Provider Reference--DNS WMI Classes


下面是代码实现

    需要引用Microsoft Scripting Runtime和Microsoft WMI Scripting V1.1 Library,只是示例了A、MX、和CName记录的操作,还可以扩展其他资源记录的操作,也可以加上区域的操作,参考MSDN就可以了

    Class DNSController
        
        Private objService As Object
        
        Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As Long
        Private Type OSVERSIONINFO
               dwOSVersionInfoSize  As Long
               dwMajorVersion  As Long
               dwMinorVersion  As Long
               dwBuildNumber  As Long
               dwPlatformId  As Long
               szCSDVersion  As String * 128
               osName  As String
        End Type
        
        
        Private Function GetWindowsVersion() As OSVERSIONINFO
            Dim ver   As OSVERSIONINFO
            ver.dwOSVersionInfoSize = 148
            GetVersionEx ver
            With ver
                Select Case .dwPlatformId
                    Case 1
                        Select Case .dwMinorVersion
                            Case 0
                                .osName = "Windows 95"
                            Case 10
                                .osName = "Windows 98"
                            Case 90
                                .osName = "Windows Mellinnium"
                        End Select
                    Case 2
                        Select Case .dwMajorVersion
                            Case 3
                                .osName = "Windows NT 3.51"
                            Case 4
                                 .osName = "Windows NT 4.0"
                            Case 5
                                If .dwMinorVersion = 0 Then
                                    .osName = "Windows 2000"
                                ElseIf .dwMinorVersion = 1 Then
                                    .osName = "Windows XP"
                                Else
                                    .osName = "Windows 2003"
                                End If
                        End Select
                      Case Else
                        .osName = "Failed"
                End Select
            End With
            GetWindowsVersion = ver
        End Function
        
        '判断操作系统,由于WMI在2003和2000上的实现略有差异,所以需要判断操作系统
        Private Function IsWin2k3() As Boolean
            Dim v   As OSVERSIONINFO
            v = GetWindowsVersion()
            If v.osName = "Windows 2003" Then
                IsWin2k3 = True
            Else
                IsWin2k3 = False
            End If
        End Function
        
        
        
        '// 
        '// 连接到一个DNS服务器
        '// 
        '// 服务器名称,可以是计算机名,也可以是IP
        '// 连接服务器所使用的用户名,如果是连接本机,请使用"" 
        '// 连接服务器所使用的密码,如果是连接本机,请使用"" 
        Public Function Connect(ByVal strServer As Variant, ByVal strUserName As Variant, ByVal strPassword As Variant, ByRef errMsg As Variant) As Variant
            
            On Error GoTo ll
        
            Connect = True
            Err.Clear
            
            Dim objLocator As WbemScripting.SWbemLocator
        
            Set objLocator = CreateObject("WbemScripting.SWbemLocator")
            
            Set objService = objLocator.ConnectServer(strServer, "root/microsoftdns", strUserName, strPassword)
            objService.Security_.ImpersonationLevel = 3
            Connect = True
            Exit Function
            
        ll: Connect = False
            errMsg = "错误 0x" & CStr(Hex(Err.Number)) & ",连接服务器 " & strServer & " 时出现错误,具体信息是" & vbCrLf & Err.Description
            Set objLocator = Nothing
            Set objService = Nothing
            Err.Clear
            
        End Function
        
        
        '// 
        '// 从服务器断开连接
        '// 
        Public Sub DisConnect()
            Set objService = Nothing
        End Sub
        
        
        
        '// 
        '// 创建区域函数
        '// 
        '// 区域名称
        '// 区域保存的文件名称  一般是 "区域名称.dns"
        '// 返回错误信息
        '// 
 
 
  
  返回操作是否成功
 
 
        Public Function CreateZone(ByVal sZoneName As Variant, ByVal sDataFileName As Variant, ByRef errMsg As Variant) As Variant
            
            Set objInst = SelectRR("MicrosoftDNS_Zone", " ContainerName=" & Chr(34) & sZoneName & Chr(34), errMsg)
        
            If errMsg <> "" Then
                CreateZone = False
                Exit Function
            End If
        
            If objInst.Count > 0 Then
                errMsg = "该区域已存在"
                CreateZone = False
            End If
        
            Set objInst = Nothing
            
            Dim oParams As New Dictionary
            oParams.Add "ZoneName", sZoneName
        
            '这是因为win2003和win2000系统中CreateZone函数的zoneType参数不一致  PrimaryZone的值在2000中是1,在2003中是0
            If IsWin2k3() Then
                zoneType = 0
            Else
                zoneType = 1
            End If
            oParams.Add "ZoneType", zoneType
        
            CreateZone = Create("MicrosoftDNS_Zone", "CreateZone", oParams, errMsg)
            
            Set oParams = Nothing
            
            
        End Function
        
        
        
        '// 
        '// 删除一个区域
        '// 
        '// 要删除区域的域名
        Public Function DeleteZone(ByVal sContainerName As Variant, ByRef errMsg As Variant) As Variant
            DeleteZone = Delete("MicrosoftDNS_Zone", "ContainerName", sContainerName, errMsg)
        End Function
        
        
        
        '// 
        '// 添加A记录
        '// 
        '// 主机名称
        '// 主机对应的IP
        '// 所在区域的域名
        Public Function CreateARecord(ByVal sHostName As Variant, ByVal sContainerName As Variant, ByVal sIPAddress As Variant, ByRef errMsg As Variant) As Variant
            
            If sHostName = "" Then
                sOwnerName = sContainerName
            Else
                sOwnerName = sHostName & "." & sContainerName
            End If
            
            Set objInst = SelectRR("MicrosoftDNS_AType", " ownerName=" & Chr(34) & sOwnerName & Chr(34), errMsg)
        
            If errMsg <> "" Then
                CreateARecord = False
                Exit Function
            End If
        
            If objInst.Count > 0 Then
                errMsg = "该记录已存在"
                CreateARecord = False
            End If
        
            Set objInst = Nothing
            
            Dim oParams As New Dictionary
            oParams.Add "ContainerName", sContainerName
            
            oParams.Add "OwnerName", sOwnerName
            
            oParams.Add "IPAddress", sIPAddress
             
            CreateARecord = Create("MicrosoftDNS_AType", "CreateInstanceFromPropertyData", oParams, errMsg)
            
            Set oParams = Nothing
        
        End Function
        
        '// 
        '// 修改A记录信息
        '// 
        '// 主机全名 比方说 www.mglz.net 
        '// 主机对应的IP
        Public Function ModifyARecord(ByVal sOwnerName As Variant, ByVal sIPAddress As Variant, ByRef errMsg As Variant) As Variant
            
            Dim oParams As New Dictionary
            
            oParams.Add "IPAddress", sIPAddress
            
            ModifyARecord = Modify("MicrosoftDNS_AType", "OwnerName", sOwnerName, "Modify", oParams, errMsg)
            
            Set oParams = Nothing
        
        End Function
        
        
        
        '// 
        '// 删除A记录记录
        '// 
        '// 主机全名 比方说 www.mglz.net
        Public Function DeleteARecord(ByVal sOwnerName As Variant, ByRef errMsg As Variant) As Variant
            DeleteARecord = Delete("MicrosoftDNS_AType", "OwnerName", sOwnerName, errMsg)
        End Function
        
        
        
        '// 
        '// 添加MX记录
        '// 
        '// 主机名称
        '// 所在区域的域名
        '// 要转向到的邮件服务器
        '// 优先级
        Public Function CreateMXRecord(ByVal sHostName As Variant, ByVal sContainerName As Variant, ByVal sMailServer As Variant, ByVal sPreference As Variant, ByRef errMsg As Variant) As Variant
            
            If sHostName = "" Then
                sOwnerName = sContainerName
            Else
                sOwnerName = sHostName & "." & sContainerName
            End If
            
            Set objInst = SelectRR("MicrosoftDNS_MXType", " ownerName=" & Chr(34) & sOwnerName & Chr(34), errMsg)
            
            If errMsg <> "" Then
                CreateMXRecord = False
                Exit Function
            End If
            
            If objInst.Count > 0 Then
                errMsg = "该记录已存在"
                CreateMXRecord = False
            End If
            
            Set objInst = Nothing
            
            Dim oParams As New Dictionary
            oParams.Add "ContainerName", sContainerName
            
            If sHostName = "" Then
                oParams.Add "OwnerName", sContainerName
            Else
                oParams.Add "OwnerName", sHostName & "." & sContainerName
            End If
            
            oParams.Add "Preference", sPreference
            oParams.Add "MailExchange", sMailServer
             
            CreateMXRecord = Create("MicrosoftDNS_MXType", "CreateInstanceFromPropertyData", oParams, errMsg)
            
            Set oParams = Nothing
        
        End Function
        
        
        '// 
        '// 修改MX记录
        '// 
        '// 主机全名 比方说 www.mglz.net 
        '// 要转向到的邮件服务器
        '// 优先级
        Public Function ModifyMXRecord(ByVal sOwnerName As Variant, ByVal sMailServer As Variant, ByVal sPreference As Variant, ByRef errMsg As Variant) As Variant
            
            Dim oParams As New Dictionary
            
            oParams.Add "MailExchange", sMailServer
            oParams.Add "Preference", sPreference
            
            ModifyMXRecord = Modify("MicrosoftDNS_MXType", "OwnerName", sOwnerName, "Modify", oParams, errMsg)
            
            Set oParams = Nothing
        
        End Function
        
        '// 
        '// 删除MX记录
        '// 
        '// 主机全名 比方说 www.mglz.net
        Public Function DeleteMXRecord(ByVal sOwnerName As Variant, ByRef errMsg As Variant) As Variant
            DeleteMXRecord = Delete("MicrosoftDNS_MXType", "OwnerName", sOwnerName, errMsg)
        End Function
        
        
        '// 
        '// 添加别名
        '// 
        '// 别名
        '// 所在区域的域名
        '// 目标主机名称
        Public Function CreateCName(ByVal sHostName As Variant, ByVal sContainerName As Variant, ByVal sPrimaryName As Variant, ByRef errMsg As Variant) As Variant
            If sHostName = "" Then
                sOwnerName = sContainerName
            Else
                sOwnerName = sHostName & "." & sContainerName
            End If
            
            Set objInst = SelectRR("MicrosoftDNS_CNAMEType", " ownerName=" & Chr(34) & sOwnerName & Chr(34), errMsg)
            
            If errMsg <> "" Then
                CreateCName = False
                Exit Function
            End If
            
            If objInst.Count > 0 Then
                errMsg = "该记录已存在"
                CreateCName = False
            End If
            
            Set objInst = Nothing
            
            Dim oParams As New Dictionary
            oParams.Add "ContainerName", sContainerName
            
            If sHostName = "" Then
                oParams.Add "OwnerName", sContainerName
            Else
                oParams.Add "OwnerName", sHostName & "." & sContainerName
            End If
            
            oParams.Add "PrimaryName", sPrimaryName
             
            CreateCName = Create("MicrosoftDNS_CNAMEType", "CreateInstanceFromPropertyData", oParams, errMsg)
            
            Set oParams = Nothing
        
        End Function
        
        
        
        '// 
        '// 修改别名
        '// 
        '// 别名全称 比方说 www.mglz.net 
        '// 目标主机名称
        Public Function ModifyCName(ByVal sOwnerName As Variant, ByVal sPrimaryName As Variant, ByRef errMsg As Variant) As Variant
            
            Dim oParams As New Dictionary
            
            oParams.Add "PrimaryName", sPrimaryName
            
            ModifyCName = Modify("MicrosoftDNS_CNAMEType", "OwnerName", sOwnerName, "Modify", oParams, errMsg)
            
            Set oParams = Nothing
        
        End Function
        
        
        
        '// 
        '// 删除别名
        '// 
        '// 别名全称 比方说 www.mglz.net
        Public Function DeleteCName(ByVal sOwnerName As Variant, ByRef errMsg As Variant) As Variant
            DeleteCName = Delete("MicrosoftDNS_CNAMEType", "OwnerName", sOwnerName, errMsg)
        End Function
        
        
        
        Private Function Create(ByVal sTableName As String, ByVal MethodName As String, ByRef oParms As Dictionary, ByRef errMsg As Variant) As Boolean
            
            On Error GoTo ll
            
            Set oProcess = objService.Get(sTableName)
            
            Set oInParams = oProcess.Methods_(MethodName).InParameters.SpawnInstance_()
            
            
            For Each Key In oParms.Keys
                oInParams.Properties_.Item(Key).Value = CStr(oParms.Item(Key))
            Next
            
            
            objService.ExecMethod sTableName, MethodName, oInParams
        
            errMsg = ""
            Create = True
            Exit Function
            
        ll:
            Create = False
            errMsg = Err.Description
            
        End Function
        
        
        Private Function Modify(ByVal sTableName As String, ByVal sFieldName As String, ByVal sFieldValue As String, ByVal MethodName As String, ByRef oParams As Dictionary, ByRef errMsg As Variant) As Boolean
            
            Dim sQuery As String
            sQuery = "SELECT * FROM " & sTableName & " WHERE " & sFieldName & " = '" & sFieldValue & "'"
            
            On Error GoTo ll
            
            Set objInst = objService.ExecQuery(sQuery)
            
            For Each o In objInst
                Set oInParams = o.Methods_(MethodName).InParameters.SpawnInstance_()
                For Each Key In oParams.Keys
                    oInParams.Properties_.Item(Key).Value = CStr(oParams.Item(Key))
                Next
                o.ExecMethod_ MethodName, oInParams
            Next
            
            errMsg = ""
            Modify = True
            Exit Function
            
        ll:
            Modify = False
            errMsg = Err.Description
        
        End Function
        
        
        Private Function Delete(ByVal sTableName As String, ByVal sFieldName As String, ByVal sFieldValue As String, ByRef errMsg As Variant) As Boolean
            
            Dim sQuery As String
            sQuery = "SELECT * FROM " & sTableName & " WHERE " & sFieldName & " = '" & sFieldValue & "'"
            
            On Error GoTo ll
            
            Set objInst = objService.ExecQuery(sQuery)
            
            For Each o In objInst
                o.Delete_
            Next
            
            errMsg = ""
            Delete = True
            Exit Function
            
        ll:
            Delete = False
            errMsg = Err.Description
        
        End Function
        
        
        
        Private Function SelectRR(ByVal recordType As String, ByVal sFilterExpression As String, ByRef errMsg As Variant) As Object
        
        
            On Error GoTo ll
                
            errMsg = ""
                    
            sql = "Select * from " & recordType
            If sFilterExpression <> "" Then
                sql = sql & " where " & sFilterExpression
            End If
            
            Set SelectRR = objService.ExecQuery(sql)
            
            errMsg = ""
            Exit Function
            
            
        ll: errMsg = Err.Description
            Set SelectRR = Nothing
            Err.Clear
        
        
        End Function
        
    end Class
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值