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就可以了

  1. Class DNSController  
  2.       
  3.     Private objService As Object 
  4.       
  5.     Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As Long 
  6.     Private Type OSVERSIONINFO  
  7.            dwOSVersionInfoSize  As Long 
  8.            dwMajorVersion  As Long 
  9.            dwMinorVersion  As Long 
  10.            dwBuildNumber  As Long 
  11.            dwPlatformId  As Long 
  12.            szCSDVersion  As String * 128  
  13.            osName  As String 
  14.     End Type  
  15.       
  16.       
  17.     Private Function GetWindowsVersion() As OSVERSIONINFO  
  18.         Dim ver   As OSVERSIONINFO  
  19.         ver.dwOSVersionInfoSize = 148  
  20.         GetVersionEx ver  
  21.         With ver  
  22.             Select Case .dwPlatformId  
  23.                 Case 1  
  24.                     Select Case .dwMinorVersion  
  25.                         Case 0  
  26.                             .osName = "Windows 95" 
  27.                         Case 10  
  28.                             .osName = "Windows 98" 
  29.                         Case 90  
  30.                             .osName = "Windows Mellinnium" 
  31.                     End Select 
  32.                 Case 2  
  33.                     Select Case .dwMajorVersion  
  34.                         Case 3  
  35.                             .osName = "Windows NT 3.51" 
  36.                         Case 4  
  37.                              .osName = "Windows NT 4.0" 
  38.                         Case 5  
  39.                             If .dwMinorVersion = 0 Then 
  40.                                 .osName = "Windows 2000" 
  41.                             ElseIf .dwMinorVersion = 1 Then 
  42.                                 .osName = "Windows XP" 
  43.                             Else 
  44.                                 .osName = "Windows 2003" 
  45.                             End If 
  46.                     End Select 
  47.                   Case Else 
  48.                     .osName = "Failed" 
  49.             End Select 
  50.         End With 
  51.         GetWindowsVersion = ver  
  52.     End Function 
  53.       
  54.     '判断操作系统,由于WMI在2003和2000上的实现略有差异,所以需要判断操作系统  
  55.     Private Function IsWin2k3() As Boolean 
  56.         Dim v   As OSVERSIONINFO  
  57.         v = GetWindowsVersion()  
  58.         If v.osName = "Windows 2003" Then 
  59.             IsWin2k3 = True 
  60.         Else 
  61.             IsWin2k3 = False 
  62.         End If 
  63.     End Function 
  64.       
  65.       
  66.       
  67.     '//   
  68.     '// 连接到一个DNS服务器  
  69.     '//   
  70.     '// 服务器名称,可以是计算机名,也可以是IP  
  71.     '// 连接服务器所使用的用户名,如果是连接本机,请使用""   
  72.     '// 连接服务器所使用的密码,如果是连接本机,请使用""   
  73.     Public Function Connect(ByVal strServer As VariantByVal strUserName As VariantByVal strPassword As VariantByRef errMsg As VariantAs Variant 
  74.           
  75.         On Error GoTo ll  
  76.       
  77.         Connect = True 
  78.         Err.Clear  
  79.           
  80.         Dim objLocator As WbemScripting.SWbemLocator  
  81.       
  82.         Set objLocator = CreateObject("WbemScripting.SWbemLocator")  
  83.           
  84.         Set objService = objLocator.ConnectServer(strServer, "root\microsoftdns", strUserName, strPassword)  
  85.         objService.Security_.ImpersonationLevel = 3  
  86.         Connect = True 
  87.         Exit Function 
  88.           
  89.     ll: Connect = False 
  90.         errMsg = "错误 0x" & CStr(Hex(Err.Number)) & ",连接服务器 " & strServer & " 时出现错误,具体信息是" & vbCrLf & Err.Description  
  91.         Set objLocator = Nothing 
  92.         Set objService = Nothing 
  93.         Err.Clear  
  94.           
  95.     End Function 
  96.       
  97.       
  98.     '//   
  99.     '// 从服务器断开连接  
  100.     '//   
  101.     Public Sub DisConnect()  
  102.         Set objService = Nothing 
  103.     End Sub 
  104.       
  105.       
  106.       
  107.     '//   
  108.     '// 创建区域函数  
  109.     '//   
  110.     '// 区域名称  
  111.     '// 区域保存的文件名称  一般是 "区域名称.dns"  
  112.     '// 返回错误信息  
  113.     '// 返回操作是否成功  
  114.     Public Function CreateZone(ByVal sZoneName As VariantByVal sDataFileName As VariantByRef errMsg As VariantAs Variant 
  115.           
  116.         Set objInst = SelectRR("MicrosoftDNS_Zone"" ContainerName=" & Chr(34) & sZoneName & Chr(34), errMsg)  
  117.       
  118.         If errMsg <> "" Then 
  119.             CreateZone = False 
  120.             Exit Function 
  121.         End If 
  122.       
  123.         If objInst.Count > 0 Then 
  124.             errMsg = "该区域已存在" 
  125.             CreateZone = False 
  126.         End If 
  127.       
  128.         Set objInst = Nothing 
  129.           
  130.         Dim oParams As New Dictionary  
  131.         oParams.Add "ZoneName", sZoneName  
  132.       
  133.         '这是因为win2003和win2000系统中CreateZone函数的zoneType参数不一致  PrimaryZone的值在2000中是1,在2003中是0  
  134.         If IsWin2k3() Then 
  135.             zoneType = 0  
  136.         Else 
  137.             zoneType = 1  
  138.         End If 
  139.         oParams.Add "ZoneType", zoneType  
  140.       
  141.         CreateZone = Create("MicrosoftDNS_Zone""CreateZone", oParams, errMsg)  
  142.           
  143.         Set oParams = Nothing 
  144.           
  145.           
  146.     End Function 
  147.       
  148.       
  149.       
  150.     '//   
  151.     '// 删除一个区域  
  152.     '//   
  153.     '// 要删除区域的域名  
  154.     Public Function DeleteZone(ByVal sContainerName As VariantByRef errMsg As VariantAs Variant 
  155.         DeleteZone = Delete("MicrosoftDNS_Zone""ContainerName", sContainerName, errMsg)  
  156.     End Function 
  157.       
  158.       
  159.       
  160.     '//   
  161.     '// 添加A记录  
  162.     '//   
  163.     '// 主机名称  
  164.     '// 主机对应的IP  
  165.     '// 所在区域的域名  
  166.     Public Function CreateARecord(ByVal sHostName As VariantByVal sContainerName As VariantByVal sIPAddress As VariantByRef errMsg As VariantAs Variant 
  167.           
  168.         If sHostName = "" Then 
  169.             sOwnerName = sContainerName  
  170.         Else 
  171.             sOwnerName = sHostName & "." & sContainerName  
  172.         End If 
  173.           
  174.         Set objInst = SelectRR("MicrosoftDNS_AType"" ownerName=" & Chr(34) & sOwnerName & Chr(34), errMsg)  
  175.       
  176.         If errMsg <> "" Then 
  177.             CreateARecord = False 
  178.             Exit Function 
  179.         End If 
  180.       
  181.         If objInst.Count > 0 Then 
  182.             errMsg = "该记录已存在" 
  183.             CreateARecord = False 
  184.         End If 
  185.       
  186.         Set objInst = Nothing 
  187.           
  188.         Dim oParams As New Dictionary  
  189.         oParams.Add "ContainerName", sContainerName  
  190.           
  191.         oParams.Add "OwnerName", sOwnerName  
  192.           
  193.         oParams.Add "IPAddress", sIPAddress  
  194.            
  195.         CreateARecord = Create("MicrosoftDNS_AType""CreateInstanceFromPropertyData", oParams, errMsg)  
  196.           
  197.         Set oParams = Nothing 
  198.       
  199.     End Function 
  200.       
  201.     '//   
  202.     '// 修改A记录信息  
  203.     '//   
  204.     '// 主机全名 比方说 www.mglz.net   
  205.     '// 主机对应的IP  
  206.     Public Function ModifyARecord(ByVal sOwnerName As VariantByVal sIPAddress As VariantByRef errMsg As VariantAs Variant 
  207.           
  208.         Dim oParams As New Dictionary  
  209.           
  210.         oParams.Add "IPAddress", sIPAddress  
  211.           
  212.         ModifyARecord = Modify("MicrosoftDNS_AType""OwnerName", sOwnerName, "Modify", oParams, errMsg)  
  213.           
  214.         Set oParams = Nothing 
  215.       
  216.     End Function 
  217.       
  218.       
  219.       
  220.     '//   
  221.     '// 删除A记录记录  
  222.     '//   
  223.     '// 主机全名 比方说 www.mglz.net  
  224.     Public Function DeleteARecord(ByVal sOwnerName As VariantByRef errMsg As VariantAs Variant 
  225.         DeleteARecord = Delete("MicrosoftDNS_AType""OwnerName", sOwnerName, errMsg)  
  226.     End Function 
  227.       
  228.       
  229.       
  230.     '//   
  231.     '// 添加MX记录  
  232.     '//   
  233.     '// 主机名称  
  234.     '// 所在区域的域名  
  235.     '// 要转向到的邮件服务器  
  236.     '// 优先级  
  237.     Public Function CreateMXRecord(ByVal sHostName As VariantByVal sContainerName As VariantByVal sMailServer As VariantByVal sPreference As VariantByRef errMsg As VariantAs Variant 
  238.           
  239.         If sHostName = "" Then 
  240.             sOwnerName = sContainerName  
  241.         Else 
  242.             sOwnerName = sHostName & "." & sContainerName  
  243.         End If 
  244.           
  245.         Set objInst = SelectRR("MicrosoftDNS_MXType"" ownerName=" & Chr(34) & sOwnerName & Chr(34), errMsg)  
  246.           
  247.         If errMsg <> "" Then 
  248.             CreateMXRecord = False 
  249.             Exit Function 
  250.         End If 
  251.           
  252.         If objInst.Count > 0 Then 
  253.             errMsg = "该记录已存在" 
  254.             CreateMXRecord = False 
  255.         End If 
  256.           
  257.         Set objInst = Nothing 
  258.           
  259.         Dim oParams As New Dictionary  
  260.         oParams.Add "ContainerName", sContainerName  
  261.           
  262.         If sHostName = "" Then 
  263.             oParams.Add "OwnerName", sContainerName  
  264.         Else 
  265.             oParams.Add "OwnerName", sHostName & "." & sContainerName  
  266.         End If 
  267.           
  268.         oParams.Add "Preference", sPreference  
  269.         oParams.Add "MailExchange", sMailServer  
  270.            
  271.         CreateMXRecord = Create("MicrosoftDNS_MXType""CreateInstanceFromPropertyData", oParams, errMsg)  
  272.           
  273.         Set oParams = Nothing 
  274.       
  275.     End Function 
  276.       
  277.       
  278.     '//   
  279.     '// 修改MX记录  
  280.     '//   
  281.     '// 主机全名 比方说 www.mglz.net   
  282.     '// 要转向到的邮件服务器  
  283.     '// 优先级  
  284.     Public Function ModifyMXRecord(ByVal sOwnerName As VariantByVal sMailServer As VariantByVal sPreference As VariantByRef errMsg As VariantAs Variant 
  285.           
  286.         Dim oParams As New Dictionary  
  287.           
  288.         oParams.Add "MailExchange", sMailServer  
  289.         oParams.Add "Preference", sPreference  
  290.           
  291.         ModifyMXRecord = Modify("MicrosoftDNS_MXType""OwnerName", sOwnerName, "Modify", oParams, errMsg)  
  292.           
  293.         Set oParams = Nothing 
  294.       
  295.     End Function 
  296.       
  297.     '//   
  298.     '// 删除MX记录  
  299.     '//   
  300.     '// 主机全名 比方说 www.mglz.net  
  301.     Public Function DeleteMXRecord(ByVal sOwnerName As VariantByRef errMsg As VariantAs Variant 
  302.         DeleteMXRecord = Delete("MicrosoftDNS_MXType""OwnerName", sOwnerName, errMsg)  
  303.     End Function 
  304.       
  305.       
  306.     '//   
  307.     '// 添加别名  
  308.     '//   
  309.     '// 别名  
  310.     '// 所在区域的域名  
  311.     '// 目标主机名称  
  312.     Public Function CreateCName(ByVal sHostName As VariantByVal sContainerName As VariantByVal sPrimaryName As VariantByRef errMsg As VariantAs Variant 
  313.         If sHostName = "" Then 
  314.             sOwnerName = sContainerName  
  315.         Else 
  316.             sOwnerName = sHostName & "." & sContainerName  
  317.         End If 
  318.           
  319.         Set objInst = SelectRR("MicrosoftDNS_CNAMEType"" ownerName=" & Chr(34) & sOwnerName & Chr(34), errMsg)  
  320.           
  321.         If errMsg <> "" Then 
  322.             CreateCName = False 
  323.             Exit Function 
  324.         End If 
  325.           
  326.         If objInst.Count > 0 Then 
  327.             errMsg = "该记录已存在" 
  328.             CreateCName = False 
  329.         End If 
  330.           
  331.         Set objInst = Nothing 
  332.           
  333.         Dim oParams As New Dictionary  
  334.         oParams.Add "ContainerName", sContainerName  
  335.           
  336.         If sHostName = "" Then 
  337.             oParams.Add "OwnerName", sContainerName  
  338.         Else 
  339.             oParams.Add "OwnerName", sHostName & "." & sContainerName  
  340.         End If 
  341.           
  342.         oParams.Add "PrimaryName", sPrimaryName  
  343.            
  344.         CreateCName = Create("MicrosoftDNS_CNAMEType""CreateInstanceFromPropertyData", oParams, errMsg)  
  345.           
  346.         Set oParams = Nothing 
  347.       
  348.     End Function 
  349.       
  350.       
  351.       
  352.     '//   
  353.     '// 修改别名  
  354.     '//   
  355.     '// 别名全称 比方说 www.mglz.net   
  356.     '// 目标主机名称  
  357.     Public Function ModifyCName(ByVal sOwnerName As VariantByVal sPrimaryName As VariantByRef errMsg As VariantAs Variant 
  358.           
  359.         Dim oParams As New Dictionary  
  360.           
  361.         oParams.Add "PrimaryName", sPrimaryName  
  362.           
  363.         ModifyCName = Modify("MicrosoftDNS_CNAMEType""OwnerName", sOwnerName, "Modify", oParams, errMsg)  
  364.           
  365.         Set oParams = Nothing 
  366.       
  367.     End Function 
  368.       
  369.       
  370.       
  371.     '//   
  372.     '// 删除别名  
  373.     '//   
  374.     '// 别名全称 比方说 www.mglz.net  
  375.     Public Function DeleteCName(ByVal sOwnerName As VariantByRef errMsg As VariantAs Variant 
  376.         DeleteCName = Delete("MicrosoftDNS_CNAMEType""OwnerName", sOwnerName, errMsg)  
  377.     End Function 
  378.       
  379.       
  380.       
  381.     Private Function Create(ByVal sTableName As StringByVal MethodName As StringByRef oParms As Dictionary, ByRef errMsg As VariantAs Boolean 
  382.           
  383.         On Error GoTo ll  
  384.           
  385.         Set oProcess = objService.Get(sTableName)  
  386.           
  387.         Set oInParams = oProcess.Methods_(MethodName).InParameters.SpawnInstance_()  
  388.           
  389.           
  390.         For Each Key In oParms.Keys  
  391.             oInParams.Properties_.Item(Key).Value = CStr(oParms.Item(Key))  
  392.         Next 
  393.           
  394.           
  395.         objService.ExecMethod sTableName, MethodName, oInParams  
  396.       
  397.         errMsg = "" 
  398.         Create = True 
  399.         Exit Function 
  400.           
  401.     ll:  
  402.         Create = False 
  403.         errMsg = Err.Description  
  404.           
  405.     End Function 
  406.       
  407.       
  408.     Private Function Modify(ByVal sTableName As StringByVal sFieldName As StringByVal sFieldValue As StringByVal MethodName As StringByRef oParams As Dictionary, ByRef errMsg As VariantAs Boolean 
  409.           
  410.         Dim sQuery As String 
  411.         sQuery = "SELECT * FROM " & sTableName & " WHERE " & sFieldName & " = '" & sFieldValue & "'" 
  412.           
  413.         On Error GoTo ll  
  414.           
  415.         Set objInst = objService.ExecQuery(sQuery)  
  416.           
  417.         For Each o In objInst  
  418.             Set oInParams = o.Methods_(MethodName).InParameters.SpawnInstance_()  
  419.             For Each Key In oParams.Keys  
  420.                 oInParams.Properties_.Item(Key).Value = CStr(oParams.Item(Key))  
  421.             Next 
  422.             o.ExecMethod_ MethodName, oInParams  
  423.         Next 
  424.           
  425.         errMsg = "" 
  426.         Modify = True 
  427.         Exit Function 
  428.           
  429.     ll:  
  430.         Modify = False 
  431.         errMsg = Err.Description  
  432.       
  433.     End Function 
  434.       
  435.       
  436.     Private Function Delete(ByVal sTableName As StringByVal sFieldName As StringByVal sFieldValue As StringByRef errMsg As VariantAs Boolean 
  437.           
  438.         Dim sQuery As String 
  439.         sQuery = "SELECT * FROM " & sTableName & " WHERE " & sFieldName & " = '" & sFieldValue & "'" 
  440.           
  441.         On Error GoTo ll  
  442.           
  443.         Set objInst = objService.ExecQuery(sQuery)  
  444.           
  445.         For Each o In objInst  
  446.             o.Delete_  
  447.         Next 
  448.           
  449.         errMsg = "" 
  450.         Delete = True 
  451.         Exit Function 
  452.           
  453.     ll:  
  454.         Delete = False 
  455.         errMsg = Err.Description  
  456.       
  457.     End Function 
  458.       
  459.       
  460.       
  461.     Private Function SelectRR(ByVal recordType As StringByVal sFilterExpression As StringByRef errMsg As VariantAs Object 
  462.       
  463.       
  464.         On Error GoTo ll  
  465.               
  466.         errMsg = "" 
  467.                   
  468.         sql = "Select * from " & recordType  
  469.         If sFilterExpression <> "" Then 
  470.             sql = sql & " where " & sFilterExpression  
  471.         End If 
  472.           
  473.         Set SelectRR = objService.ExecQuery(sql)  
  474.           
  475.         errMsg = "" 
  476.         Exit Function 
  477.           
  478.           
  479.     ll: errMsg = Err.Description  
  480.         Set SelectRR = Nothing 
  481.         Err.Clear  
  482.       
  483.       
  484.     End Function 
  485.       
  486. end Class 

本日志由 flyinweb 于 2009-12-22 15:18:43 发表,目前已经被浏览 171 次,评论 0 次;

作者添加了以下标签: VBWMIDNS

引用通告:http://www.517sou.net/Article/358/Trackback.ashx

评论订阅:http://www.517sou.net/Article/358/Feeds.ashx

相关文章

评论列表

    暂时没有评论
(必填)
(必填,不会被公开)