yaosansi's Blog

当你背向太阳的时候,你只会看到自己的阴影!能力是有限的,努力无限的!

导航

C#利用WMI操作DNS服务器(可远程操作,需要相应权限)

DNS测试类:
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;

namespace Yaosansi
{
    
class Test
    {
        
static void Main()
        {
            MyDnsTEST();
        }

        
/// <summary>
        
/// MyDnsTEST功能测试
            
/// C#利用WMI操作DNS服务器(可远程操作,需要相应权限)
            
/// Author:yaosansi 
            
/// Create Date:2005-09-07
            
/// Modify Date:2006-10-25
            
/// Site:http://www.yaosansi.com/
            
/// E-mail:yaosansi at 126 dot com
            
/// http://www.yaosansi.com/blog/article.asp?id=935
            
/// http://yaosansi.cnblogs.com/archive/2006/11/04/DNSServiceInCsharpWithWMI.html
            
/// 注意:此版本为WINDOWS2003 DNS服务器专用.不适合其它版本操作系统.
        
/// </summary>
        static void MyDnsTEST()
        {
            Yaosansi.Net.MYDNS dns 
= new Yaosansi.Net.MYDNS();
            
//===========================================
            
//不对以下三个属性赋值默认DNS服务器为本机.
            dns.ServerName = "202.96.64.68";
            dns.userName 
= "Administrator";
            dns.passWord 
= "123456789";
            
//===========================================
            
//dns.CreateZone("yaosansi.com");
            
//dns.DelZone("yaosansi.com");
            
//dns.CreateAType("yaosansi.com", "www", "2.2.2.2", "3600");
            
//dns.ModifyAType("yaosansi.com","www","127.21.0.1","800");
            
//dns.DelAType("yaosansi.com", "mail");
            
//dns.CreateMXType("mail", "yaosansi.com", "5.5.5.5", "20", "3600");
            
//dns.ModifyMXType("mail", "yaosansi.com", "36000", "218.1.1.1", "26");
            
//dns.DelMXType("mail", "yaosansi.com");
            
//dns.CreateCNAMEType("mpq2", "yaosansi.com", "www.yaosansi.com", "3900");
            
//dns.ModifyCNAMEType("mpq2", "abc.com", "30520", "www.yaosansi.com.");
            
//dns.DelCNAMEType("mpq", "yaosansi.com");

            
//DataTable table = dns.ListExistsMXType("yaosansi.com");
            DataTable table = dns.ListExistsAType("yaosansi.com");
            
//DataTable table = dns.ListExistsCNAMEType("yaosansi.com");
            Yaosansi.Data.DataHelp.PrintTable(table);

            
if (!string.IsNullOrEmpty(dns.ErrMessage))
            {
                Console.WriteLine(
"--------------------------------------------------");
                Console.WriteLine(
"返回信息:" + dns.ErrMessage);
                Console.WriteLine(
"--------------------------------------------------");
            }
            Console.WriteLine(
"");
            Console.WriteLine(
"===End===");
            Console.ReadLine();
        }
    }
}

MYDNS类:
using System;
using System.Management;
using System.Data;

namespace Yaosansi.Net
{
    
/// <summary>
    
/// C#利用WMI操作DNS服务器(可远程操作,需要相应权限)
    
/// Author:yaosansi 
    
/// Create Date:2005-09-07
    
/// Modify Date:2006-10-25
    
/// Site:http://www.yaosansi.com/
    
/// E-mail:yaosansi at 126 dot com
    
/// http://www.yaosansi.com/blog/article.asp?id=935
    
///  http://yaosansi.cnblogs.com/archive/2006/11/04/DNSServiceInCsharpWithWMI.html
    
/// 注意:此版本为WINDOWS2003 DNS服务器专用.不适合其它版本操作系统.
    
/// </summary>
    public class MYDNS
    {
        
//要连接的DNS服务器
        private string sServerPath;
        
//用户名
        private string username = null;
        
//密码
        private string password = null;
        
//服务器名称或IP地址
        private string DNSName = null;
        
//表示管理操作的范围.这里是用来执行DNS的命名空间
        private ManagementScope DNS;
        
//用于返回检索的ManagementObject集合
        private System.Management.ManagementObjectCollection Q;
        
//
        private ManagementClass DnsClass;
        
//
        private ManagementBaseObject MI;

        
/// <summary>
        
/// 返回的操作信息.
        
/// </summary>
        private string errMessage=null;

        
/// <summary>
        
/// 获取错误信息.
        
/// </summary>
        public string ErrMessage
        {
            
get
            {
                
return errMessage;
            }
        }
        
/// <summary>
        
/// 设置DNS服务器名称或IP地址
        
/// </summary>
        public string ServerName
        {
            
set
            {
                
this.sServerPath = string.Format(@"\\{0}\root\MicrosoftDNS", value);
                
this.DNSName = value;
            }
        }

        
/// <summary>
        
/// 设置连接服务器的用户名(指定服务器IP,用户和密码后将自动连接远程服务器,本机不需要指定)
        
/// </summary>
        public string userName
        {
            
set
            {
                
this.username = value;
            }
        }

        
/// <summary>
        
/// 设置连接服务器的密码(指定服务器IP,用户和密码后将自动连接远程服务器,本机不需要指定)
        
/// </summary>
        public string passWord
        {
            
set
            {
                
this.password = value;
            }
        }

        
/// <summary>
        
/// 构造函数
        
/// </summary>
        public MYDNS()
        {
            sServerPath 
= @"\\localhost\root\MicrosoftDNS";
            DNSName 
= "localhost";
        }



        
/// <summary>
        
/// 建立对象.连接
        
/// </summary>
        
/// <param name="DnsType">DNS类型 MicrosoftDNS_Zone等</param>
        private void Create(string DnsType)
        {
            
if (!string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(password))
            {
                System.Management.ConnectionOptions Conn 
= new ConnectionOptions();
                Conn.Username 
= username; //用户名
                Conn.Password = password; //口令
                DNS = new ManagementScope(sServerPath,Conn);
            }
            
else
            {
                DNS 
= new ManagementScope(sServerPath);
            }
            
if (!DNS.IsConnected)
            {
                DNS.Connect();
            }
            ManagementPath Path 
= new ManagementPath(DnsType);
            
this.DnsClass = new ManagementClass(DNS, Path, null);
        }

        
/// <summary>
        
/// 查询DNS并建立对象
        
/// </summary>
        
/// <param name="query">WQL查询语句</param>
        
///  <param name="DnsType">DNS类型 MicrosoftDNS_Zone等</param>
        
/// <returns></returns>
        public ManagementObjectCollection QueryDNS(string query, string DnsType)
        {
            
this.Create(DnsType);
            System.Management.ManagementObjectSearcher QS 
= new ManagementObjectSearcher(DNS, new ObjectQuery(query));
            QS.Scope 
= DNS;
            
return QS.Get();
        }

        
/// <summary>
        
/// 仅查询DNS
        
/// </summary>
        
/// <param name="query">WQL查询语句</param>
        
/// <returns></returns>
        public ManagementObjectCollection QueryDNS(string query)
        {
            
if (!string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(password))
            {
                System.Management.ConnectionOptions Conn 
= new ConnectionOptions();
                Conn.Username 
= username; //用户名
                Conn.Password = password; //口令
                DNS = new ManagementScope(sServerPath, Conn);
            }
            
else
            {
                DNS 
= new ManagementScope(sServerPath);
            }
            
if (!DNS.IsConnected)
            {
                DNS.Connect();
            }
            System.Management.ManagementObjectSearcher QS 
= new ManagementObjectSearcher(DNS, new ObjectQuery(query));
            QS.Scope 
= DNS;
            
return QS.Get();
        }


        
/// <summary>
        
/// 判断区域是否存在
        
/// </summary>
        
/// <param name="domain">区域名称</param>
        
/// <returns></returns>
        public bool IsExistsZone(string domain)
        {

            
try
            {
                Q 
= QueryDNS("Select * From MicrosoftDNS_ZONE where ContainerName='" + domain + "'");
                
foreach (ManagementObject oManObject in Q)
                {
                    
//Console.WriteLine(oManObject["ContainerName"].ToString());
                    return true;
                }
                
return false;
            }
            
catch (Exception e)
            {
                errMessage 
= e.Message;
                Console.WriteLine(e.ToString());
                
return false;
            }

        }




        
/// <summary>
        
/// 创建一个新的区域,仅区域名称
        
/// </summary>
        
/// <param name="domain">区域的名称</param>
        public bool CreateZone(string domain)
        {
            
try
            {
                
this.Create("MicrosoftDNS_Zone");
                
//如果区域已经存在
                if (IsExistsZone(domain))
                {
                    errMessage 
= "域:"+domain+"已经存在.";
                    
return false;
                }
                
//建立新的区域
                this.MI = DnsClass.GetMethodParameters("CreateZone");
                
this.MI["ZoneName"= domain;
                
this.MI["ZoneType"= 0;

                ManagementBaseObject OutParams 
= this.DnsClass.InvokeMethod("CreateZone", MI, null);
                errMessage 
= "域:"+domain+"创建成功.";
                
return true;
            }
            
catch (Exception e)
            {
                errMessage 
= e.Message;
                Console.WriteLine(e.ToString());
                
return false;
            }

        }


        
/// <summary>
        
/// 创建一个区域,包括其它参数
        
/// </summary>
        
/// <param name="domain">要创建的区域名称</param>
        
/// <param name="ZoneType">Type of zone. Valid values are the following:0 Primary zone. 1 Secondary zone.  2 Stub zone. 3 Zone forwarder. </param>
        
/// <param name="DataFileName">[in, optional] Name of the data file associated with the zone</param>
        
/// <param name="IpAddr">[in, optional] IP address of the mater DNS Server for the zone. </param>
        
/// <param name="AdminEmailName">[in, optional] Email address of the administrator responsible for the zone</param>
        
/// <returns></returns>
        public bool CreateZone(string domain, uint ZoneType, string DataFileName, string[] IpAddr, string AdminEmailName)
        {
            
try
            {
                
this.Create("MicrosoftDNS_Zone");
                
//如果区域已经存在
                if (IsExistsZone(domain))
                {
                    errMessage 
= "域:" + domain + "已经存在.";
                    
return false;
                }
                
//建立新的区域
                MI = DnsClass.GetMethodParameters("CreateZone");
                MI[
"ZoneName"= domain;
                MI[
"ZoneType"= ZoneType;
                MI[
"DataFileName"= DataFileName;
                MI[
"IpAddr"= IpAddr;
                MI[
"AdminEmailName"= AdminEmailName;
                ManagementBaseObject OutParams 
= this.DnsClass.InvokeMethod("CreateZone", MI, null);
                errMessage 
= "域:" + domain + "创建成功.";
                
return true;
            }
            
catch (Exception e)
            {
                errMessage 
= e.Message;
                Console.WriteLine(e.ToString());
                
return false;
            }

        }


        
/// <summary>
        
/// 修改区域
        
/// </summary>
        
/// <param name="domain">要修改的区域名称</param>
        
/// <param name="ZoneType">Type of zone. Valid values are the following:0 Primary zone. 1 Secondary zone.  2 Stub zone. 3 Zone forwarder. </param>
        
/// <param name="DataFileName">[in, optional] Name of the data file associated with the zone</param>
        
/// <param name="IpAddr">[in, optional] IP address of the mater DNS Server for the zone. </param>
        
/// <param name="AdminEmailName">[in, optional] Email address of the administrator responsible for the zone</param>
        
/// <returns></returns>
        public bool ChangeZoneType(string domain, uint ZoneType, string DataFileName, string[] IpAddr, string AdminEmailName)
        {
            
try
            {
                Q 
= QueryDNS("Select * From MicrosoftDNS_ZONE where ContainerName='" + domain + "'""MicrosoftDNS_Zone");

                
foreach (ManagementObject oManObject in Q)
                {
                    MI 
= oManObject.GetMethodParameters("ChangeZoneType");
                    MI[
"ZoneType"= ZoneType;
                    MI[
"DataFileName"= DataFileName;
                    MI[
"IpAddr"= IpAddr;
                    MI[
"AdminEmailName"= AdminEmailName;
                    oManObject.InvokeMethod(
"ChangeZoneType", MI, null);
                    errMessage 
= "域:" + domain + "修改成功.";
                    
return true;
                }
                errMessage 
= "未找到域:"+domain;
                
return false;
            }
            
catch (Exception e)
            {
                errMessage 
= e.Message;
                Console.WriteLine(e.ToString());
                
return false;
            }
        }

        
/// <summary>
        
/// 删除区域
        
/// </summary>
        
/// <param name="domain">要册除的区域的名称</param>
        
/// <returns></returns>
        public bool DelZone(string domain)
        {
            
try
            {
                Q 
= QueryDNS("Select * From MicrosoftDNS_ZONE where ContainerName='" + domain + "'""MicrosoftDNS_Zone");
                
foreach (ManagementObject oManObject in Q)
                {
                    oManObject.Delete();
                    errMessage 
= "域:" + domain + "删除成功.";
                    
return true;
                }
                errMessage 
= "未找到域:" + domain;
                
return false;
            }
            
catch (Exception e)
            {
                errMessage 
= e.Message;
                Console.WriteLine(e.ToString());
                
return false;
            }

        }

        
/// <summary>
        
/// 判断在某MicrosoftDNS_AType是否在指定的域中存在
        
/// </summary>
        
/// <param name="domain"></param>
        
/// <param name="OwnerName"></param>
        
/// <returns></returns>
        public bool IsExistsAType(string domain, string OwnerName)
        {
            
try
            {
                Q 
= QueryDNS("Select * From MicrosoftDNS_AType where OwnerName='" + OwnerName + "' and ContainerName='" + domain + "'");
                
foreach (ManagementObject oManObject in Q)
                {
                    
//Console.WriteLine(oManObject["OwnerName"].ToString());
                    return true;
                }
                
return false;
            }
            
catch (Exception e)
            {
                errMessage 
= e.Message;
                Console.WriteLine(e.ToString());
                
return false;
            }
        }


        
/// <summary>
        
/// 创建MicrosoftDNS_AType 
        
/// </summary>
        
/// <param name="ContainerName">Name of the Container for the Zone, Cache, or RootHints instance which contains this RR</param>
        
/// <param name="HostName">主机名 [如果为空或NULL,主机名将与域名保持一致.]</param>
        
/// <param name="TTL">Time, in seconds, that the RR can be cached by a DNS resolver</param>
        
/// <param name="IPAddress">String representing the IPv4 address of the host</param>
        
/// <returns></returns>
        public bool CreateAType(string ContainerName, string HostName, string IPAddress,string TTL)
        {
            
try
            {
                
string OwnerName = null;
                
if (string.IsNullOrEmpty(HostName))
                {
                    OwnerName 
= ContainerName;
                }
                
else
                {
                    OwnerName 
= HostName + "." + ContainerName;
                }
                
this.Create("MicrosoftDNS_AType");
                
//如果区域不存在
                if (!IsExistsZone(ContainerName))
                {
                    Console.WriteLine(
"区域:{0}不存在,创建失败", ContainerName);
                    errMessage 
= string.Format("区域:{0}不存在,创建失败", ContainerName);
                    
return false;
                }
                
if (IsExistsAType(ContainerName, OwnerName))
                {
                    Console.WriteLine(
"{0}中已存在{1},创建失败", ContainerName, OwnerName);
                    errMessage 
= string.Format("{0}中已存在{1},创建失败", ContainerName, OwnerName);
                    
return false;
                }
                MI 
= DnsClass.GetMethodParameters("CreateInstanceFromPropertyData");
                MI[
"DnsServerName"= "localhost";
                MI[
"ContainerName"= ContainerName;
                MI[
"OwnerName"= OwnerName;
                MI[
"IPAddress"= IPAddress;
                
if (string.IsNullOrEmpty(TTL))
                {
                    TTL 
= "3600";
                }
                MI[
"TTL"=TTL;
                DnsClass.InvokeMethod(
"CreateInstanceFromPropertyData", MI, null);
                errMessage 
= "A记录:" + OwnerName + "创建成功.";
                
return true;
            }
            
catch (Exception e)
            {
                errMessage 
= e.Message;
                Console.WriteLine(e.ToString());
                
return false;
            }
           
        }


        
/// <summary>
        
/// 创建MicrosoftDNS_AType 
        
/// </summary>
        
/// <param name="DnsServerName">FQDN or IP address of the DNS Server that contains this RR</param>
        
/// <param name="ContainerName">Name of the Container for the Zone, Cache, or RootHints instance which contains this RR</param>
        
/// <param name="HostName">主机名 [如果为空或NULL,主机名将与域名保持一致.]</param>
        
/// <param name="RecordClass">Class of the RR. Default value is 1. The following values are valid.1 IN (Internet) 2 CS (CSNET)  3 CH (CHAOS) 4 HS (Hesiod) </param>
        
/// <param name="TTL">Time, in seconds, that the RR can be cached by a DNS resolver</param>
        
/// <param name="IPAddress">String representing the IPv4 address of the host</param>
        
/// <returns></returns>
        public bool CreateAType(string DnsServerName, string ContainerName, string HostName, uint RecordClass, uint TTL, string IPAddress)
        {
            
try
            {
                
string OwnerName = null;
                
if (string.IsNullOrEmpty(HostName))
                {
                    OwnerName 
= ContainerName;
                }
                
else
                {
                    OwnerName 
= HostName + "." + ContainerName;
                }
                
this.Create("MicrosoftDNS_AType");
                
//如果区域不存在
                if (!IsExistsZone(ContainerName))
                {
                    Console.WriteLine(
"区域:{0}不存在,创建失败", ContainerName);
                    errMessage 
= string.Format("区域:{0}不存在,创建失败", ContainerName);
                    
return false;
                }
                
if (IsExistsAType(ContainerName, OwnerName))
                {
                    Console.WriteLine(
"{0}中已存在{1},创建失败", ContainerName, OwnerName);
                    errMessage
=string.Format("{0}中已存在{1},创建失败", ContainerName, OwnerName);
                    
return false;
                }
                MI 
= DnsClass.GetMethodParameters("CreateInstanceFromPropertyData");
                MI[
"DnsServerName"= DnsServerName;
                MI[
"ContainerName"= ContainerName;
                MI[
"OwnerName"= OwnerName;
                MI[
"RecordClass"= RecordClass;
                MI[
"TTL"= TTL;
                MI[
"IPAddress"= IPAddress;
                DnsClass.InvokeMethod(
"CreateInstanceFromPropertyData", MI, null);
                errMessage 
= "A记录:" + OwnerName + "创建成功.";
                
return true;
            }
            
catch (Exception e)
            {
                errMessage 
= e.Message;
                Console.WriteLine(e.ToString());
                
return false;
            }

        }


        
/// <summary>
        
/// 修改MicrosoftDNS_AType 
        
/// </summary>
        
/// <param name="ContainerName">Name of the Container for the Zone, Cache, or RootHints instance which contains this RR</param>
        
/// <param name="HostName">主机名 [如果为空或NULL,主机名将与域名保持一致.]</param>
        
/// <param name="TTL">Time, in seconds, that the RR can be cached by a DNS resolver</param>
        
/// <param name="IPAddress"></param>
        
/// <returns></returns>
        public bool ModifyAType(string ContainerName, string HostName, string IPAddress,string TTL)
        {
            
try
            {
                
string OwnerName = null;
                
if (string.IsNullOrEmpty(HostName))
                {
                    OwnerName 
= ContainerName;
                }
                
else
                {
                    OwnerName 
= HostName + "." + ContainerName;
                }

                
//如果区域不存在
                if (!IsExistsZone(ContainerName))
                {
                    Console.WriteLine(
"区域:{0}不存在,修改失败", ContainerName);
                    errMessage 
= string.Format("区域:{0}不存在,修改失败", ContainerName);
                    
return false;
                }
                
if (!IsExistsAType(ContainerName, OwnerName))
                {
                    Console.WriteLine(
"{0}中不存在{1},修改失败", ContainerName, OwnerName);
                    errMessage 
= string.Format("{0}中不存在{1},修改失败", ContainerName, OwnerName);
                    
return false;
                }


                Q 
= QueryDNS("Select * From MicrosoftDNS_AType where ContainerName='" + ContainerName + "' and OwnerName='" + OwnerName + "'""MicrosoftDNS_AType");

                
foreach (ManagementObject oManObject in Q)
                {
                    
//foreach (PropertyData p in oManObject.Properties)
                    
//{
                    
//    try
                    
//    { Console.WriteLine(p.Name+"="+oManObject[p.Name]); }
                    
//    catch
                    
//    { }
                    
//}
                    if (oManObject["IPAddress"].ToString() == IPAddress)
                    {
                        errMessage 
= "A记录:" + OwnerName + "修改失败,必须修改IP地址.";
                        
return false;
                    }

                    MI 
= oManObject.GetMethodParameters("Modify");
                    MI[
"IPAddress"= IPAddress;
                    MI[
"TTL"= TTL;
                    oManObject.InvokeMethod(
"Modify", MI, null);
                    errMessage 
= "A记录:" + OwnerName + "修改成功.";
                    
return true;
                }
                errMessage 
= string.Format("{0}中不存在{1},修改失败", ContainerName, OwnerName);
                
return false;
            }
            
catch (Exception e)
            {
                errMessage 
= e.Message;
                Console.WriteLine(e.ToString());
                
return false;
            }
        }


     


        
/// <summary>
        
/// 删除MicrosoftDNS_AType
        
/// </summary>
        
/// <param name="ContainerName">Name of the Container for the Zone, Cache, or RootHints instance which contains this RR</param>
        
/// <param name="HostName">主机名 [如果为空或NULL,主机名将与域名保持一致.]</param>
        
/// <returns></returns>
        public bool DelAType(string ContainerName, string HostName)
        {
            
try
            {
                
string OwnerName = null;
                
if (string.IsNullOrEmpty(HostName))
                {
                    OwnerName 
= ContainerName;
                }
                
else
                {
                    OwnerName 
= HostName + "." + ContainerName;
                }

                
//如果区域不存在
                if (!IsExistsZone(ContainerName))
                {
                    Console.WriteLine(
"区域:{0}不存在,删除失败", ContainerName);
                    errMessage 
= string.Format("区域:{0}不存在,删除失败", ContainerName);
                    
return false;
                }
                
if (!IsExistsAType(ContainerName, OwnerName))
                {
                    Console.WriteLine(
"{0}中不存在{1},删除失败", ContainerName, OwnerName);
                    errMessage 
= string.Format("{0}中不存在{1},删除失败", ContainerName, OwnerName);
                    
return false;
                }

                Q 
= QueryDNS("Select * From MicrosoftDNS_AType where ContainerName='" + ContainerName + "' and OwnerName='" + OwnerName + "'""MicrosoftDNS_AType");

                
foreach (ManagementObject oManObject in Q)
                {
                    oManObject.Delete();
                    errMessage 
= "A记录:" + OwnerName + "删除成功.";
                    
return true;
                }
                errMessage 
= string.Format("{0}中不存在{1},删除失败", ContainerName, OwnerName);
                
return false;
            }
            
catch (Exception e)
            {
                errMessage 
= e.Message;
                Console.WriteLine(e.ToString());
                
return false;
            }
        }


        
/// <summary>
        
/// 列出某域名下的所有A记录.
        
/// </summary>
        
/// <param name="ContainerName">Name of the Container for the Zone, Cache, or RootHints instance which contains this RR</param>
        
/// <returns></returns>
        public DataTable ListExistsAType(string ContainerName)
        {
            Yaosansi.IO.Log log 
= new Yaosansi.IO.Log();
            log.WirteLogTime();
            log.WirteLog(ContainerName);
            
            DataTable table 
= new DataTable("MicrosoftDNS_AType" + ContainerName);
            table.Columns.Add(
"主机名 (A)");
            table.Columns.Add(
"IP 地址");
            table.Columns.Add(
"TTL");
            
try
            {
                Q 
= QueryDNS("Select * From MicrosoftDNS_AType where ContainerName='" + ContainerName + "'");

                
foreach (ManagementObject oManObject in Q)
                {
                    
try
                    {
                        DataRow row 
= table.NewRow();
                        row[
"主机名 (A)"= oManObject["OwnerName"];
                        row[
"IP 地址"= oManObject["IPAddress"];
                        row[
"TTL"= oManObject["TTL"];
                        table.Rows.Add(row);
                    }
                    
catch (Exception e) { log.WirteLog(e.ToString()); }
                }
            }
            
catch (Exception e)
            {
                errMessage 
= e.Message;
                Console.WriteLine(e.ToString());
                log.WirteLog(e.ToString());
            }
            Yaosansi.Data.DataHelp.PrintTableLog(table);
            
return table;
        }



        
/// <summary>
        
/// 列出某域名下的所有MX记录.
        
/// </summary>
        
/// <param name="ContainerName">Name of the Container for the Zone, Cache, or RootHints instance which contains this RR</param>
        
/// <returns></returns>
        public DataTable ListExistsMXType(string ContainerName)
        {
            DataTable table 
= new DataTable("MicrosoftDNS_MXType" + ContainerName);
            table.Columns.Add(
"邮件交换记录 (MX)");
            table.Columns.Add(
"目标主机");
            table.Columns.Add(
"优先级");
            table.Columns.Add(
"TTL");
            
try
            {
                Q 
= QueryDNS("Select * From MicrosoftDNS_MXType where ContainerName='" + ContainerName + "'");

                
foreach (ManagementObject oManObject in Q)
                {
                    
try
                    {
                        DataRow row 
= table.NewRow();
                        row[
"目标主机"= oManObject["MailExchange"];
                        row[
"邮件交换记录 (MX)"= oManObject["OwnerName"];
                        row[
"优先级"= oManObject["Preference"];
                        row[
"TTL"= oManObject["TTL"];
                        table.Rows.Add(row);
                    }
                    
catch { }
                }
            }
            
catch (Exception e)
            {
                errMessage 
= e.Message;
                Console.WriteLine(e.ToString());
            }
            
return table;
        }


        
/// <summary>
        
/// 列出某域名下的所有别名.
        
/// </summary>
        
/// <param name="ContainerName">Name of the Container for the Zone, Cache, or RootHints instance which contains this RR</param>
        
/// <returns></returns>
        public DataTable ListExistsCNAMEType(string ContainerName)
        {
            DataTable table 
= new DataTable("MicrosoftDNS_CNAMEType" + ContainerName);
            table.Columns.Add(
"别名 (CNAME)");
            table.Columns.Add(
"别名主机");
            table.Columns.Add(
"TTL");
            
try
            {
                Q 
= QueryDNS("Select * From MicrosoftDNS_CNAMEType where ContainerName='" + ContainerName + "'");
                
foreach (ManagementObject oManObject in Q)
                {
                    
try
                    {
                        DataRow row 
= table.NewRow();
                        row[
"别名 (CNAME)"= oManObject["OwnerName"];
                        row[
"别名主机"= oManObject["PrimaryName"];
                        row[
"TTL"= oManObject["TTL"];
                        table.Rows.Add(row);
                    }
                    
catch { }
                }
            }
            
catch (Exception e)
            {
                errMessage 
= e.Message;
                Console.WriteLine(e.ToString());
            }
            
return table;
        }


        
/// <summary>
        
/// 判断在某MicrosoftDNS_MXType是否在指定的域中存在
        
/// </summary>
        
/// <param name="ContainerName">主域名 主域 Name of the Container for the Zone, Cache, or RootHints instance that contains this RR.</param>
        
/// <param name="OwnerName">Owner name for the RR. </param>
        
/// <returns></returns>
        public bool IsExistsMXType(string ContainerName, string OwnerName)
        {           
            
try
            {

                Q 
= QueryDNS("Select * From MicrosoftDNS_MXType Where ContainerName='" + ContainerName + "' and OwnerName='" + OwnerName + "'");

                
foreach (ManagementObject oManObject in Q)
                {
                  
//  Console.WriteLine(oManObject["MailExchange"].ToString());
                    return true;
                }
                
return false;
            }
            
catch (Exception e)
            {
                errMessage 
= e.Message;
                Console.WriteLine(e.ToString());
                
return false;
            }
        }

        
/// <summary>
        
/// 创建MicrosoftDNS_MXType记录(邮件交换记录)
        
/// </summary>
        
/// <param name="HostName">主机名 [如果为空或NULL,主机名将与域名保持一致.]</param>
        
/// <param name="ContainerName">主域 Name of the Container for the Zone, Cache, or RootHints instance that contains this RR.</param>
        
/// <param name="MailExchange">目标主机 FQDN specifying a host willing to act as a mail exchange for the owner name</param>
        
/// <param name="Preference">优先级 Preference given to this RR among others at the same owner. Lower values are preferred</param>
        
/// <param name="TTL">Time, in seconds, that the RR can be cached by a DNS resolver</param>
        
/// <returns></returns>
        public bool CreateMXType(string HostName, string ContainerName,string MailExchange, string Preference, string TTL)
        {
            
try
            {
                
string OwnerName = null;
                
if (string.IsNullOrEmpty(HostName))
                {
                    OwnerName 
= ContainerName;
                }
                
else
                {
                    OwnerName 
= HostName + "." + ContainerName;
                }

                
this.Create("MicrosoftDNS_MXType");
                
//如果区域不存在
                if (!IsExistsZone(ContainerName))
                {
                    Console.WriteLine(
"区域:{0}不存在,创建失败", ContainerName);
                    errMessage 
= string.Format("区域:{0}不存在,创建失败", ContainerName);
                    
return false;
                }
                
if (IsExistsMXType(ContainerName,OwnerName))
                {
                    Console.WriteLine(
"{0}中已存在{1},创建失败", ContainerName,OwnerName );
                    errMessage 
= string.Format("{0}中已存在{1},创建失败", ContainerName, OwnerName);
                    
return false;
                }
                
                MI 
= DnsClass.GetMethodParameters("CreateInstanceFromPropertyData");
              
                MI[
"DnsServerName"= "localhost";
                MI[
"ContainerName"= ContainerName;
                
// MI["RecordClass"] = 1;  //Default value is 1.  //1 IN (Internet)  //2 CS (CSNET)   //3 CH (CHAOS)   //4 HS (Hesiod) 
                MI["MailExchange"= MailExchange;
                MI[
"OwnerName"= OwnerName;
                MI[
"Preference"= Preference;

                
if (string.IsNullOrEmpty(TTL))
                {
                    TTL 
= "3600";
                }
                MI[
"TTL"= TTL;
                DnsClass.InvokeMethod(
"CreateInstanceFromPropertyData", MI, null);
                errMessage 
= "MX记录:" + OwnerName + "创建成功.";
                
return true;
            }
            
catch (Exception e)
            {
                errMessage 
= e.Message;
                Console.WriteLine(e.ToString());
                
return false;
            }
           
        }

        
/// <summary>
        
/// 修改MicrosoftDNS_MXType记录(修改邮件交换记录)
        
/// </summary>
        
/// <param name="HostName">主机名 [如果为空或NULL,主机名将与域名保持一致.]</param>
        
/// <param name="ContainerName">主域名 主域 Name of the Container for the Zone, Cache, or RootHints instance that contains this RR.</param>
        
/// <param name="TTL">[in, optional] Time, in seconds, that the RR can be cached by a DNS resolver. </param>
        
/// <param name="MailExchange">[in, optional] FQDN specifying a host willing to act as a mail exchange for the owner name. </param>
        
/// <param name="Preference">邮件优先级 [in, optional] Preference given to this RR among others at the same owner. Lower values are preferred. </param>
        
/// <returns></returns>
        public bool ModifyMXType(string HostName, string ContainerName, string TTL, string MailExchange,string Preference)
        {
            
try
            {
                
string OwnerName = null;
                
if (string.IsNullOrEmpty(HostName))
                {
                    OwnerName 
= ContainerName;
                }
                
else
                {
                    OwnerName 
= HostName + "." + ContainerName;
                }

                
this.Create("MicrosoftDNS_MXType");
                
//如果区域不存在
                if (!IsExistsZone(ContainerName))
                {
                    Console.WriteLine(
"区域:{0}不存在,修改失败", ContainerName);
                    errMessage 
= string.Format("区域:{0}不存在,修改失败", ContainerName);
                    
return false;
                }
                
if (!IsExistsMXType(ContainerName, OwnerName))
                {
                    Console.WriteLine(
"{0}中不存在{1},修改失败", ContainerName, OwnerName);
                    errMessage 
= string.Format("{0}中不存在{1},修改失败", ContainerName, OwnerName);
                    
return false;
                }
                Q 
= QueryDNS("Select * From MicrosoftDNS_MXType Where ContainerName='" + ContainerName + "' and OwnerName='" + OwnerName + "'"); 
                
foreach (ManagementObject oManObject in Q)
                {
                    MI 
= oManObject.GetMethodParameters("Modify");
                    
if (string.IsNullOrEmpty(TTL))
                    {
                        TTL 
= "3600";
                    }

                    
if (ClearEndDot(oManObject["MailExchange"].ToString()) == ClearEndDot(MailExchange) && oManObject["Preference"].ToString() == Preference)
                    {
                        errMessage 
= "MX记录:" + OwnerName + "修改失败,必须修改目标主机或邮件优先级.";
                        
return false;
                    }

                    MI[
"TTL"= TTL;
                    MI[
"MailExchange"= MailExchange;
                    MI[
"Preference"= Preference;
                    oManObject.InvokeMethod(
"Modify", MI, null);
                    errMessage 
= "MX记录:" + OwnerName + "修改成功.";
                    
return true;
                }
                
return false;
            }
            
catch (Exception e)
            {
                errMessage 
= e.Message;
                Console.WriteLine(e.ToString());
                
return false;
            }
        }



        
/// <summary>
        
/// 删除MicrosoftDNS_MXType
        
/// </summary>
        
/// <param name="HostName">主机名 [如果为空或NULL,主机名将与域名保持一致.]</param>
        
/// <param name="ContainerName">主域名 主域 Name of the Container for the Zone, Cache, or RootHints instance that contains this RR.</param>
        
/// <returns></returns>
        public bool DelMXType(string HostName, string ContainerName)
        {
            
try
            { 
                
string OwnerName = null;
                
if (string.IsNullOrEmpty(HostName))
                {
                    OwnerName 
= ContainerName;
                }
                
else
                {
                    OwnerName 
= HostName + "." + ContainerName;
                }

                
this.Create("MicrosoftDNS_MXType");
                
//如果区域不存在
                if (!IsExistsZone(ContainerName))
                {
                    Console.WriteLine(
"区域:{0}不存在,删除失败", ContainerName);
                    errMessage 
= string.Format("区域:{0}不存在,删除失败", ContainerName);
                    
return false;
                }
                
if (!IsExistsMXType(ContainerName, OwnerName))
                {
                    Console.WriteLine(
"{0}中不存在{1},删除失败", ContainerName, OwnerName);
                    errMessage 
= string.Format("{0}中不存在{1},删除失败", ContainerName, OwnerName);
                    
return false;
                }
                Q 
= QueryDNS("Select * From MicrosoftDNS_MXType Where ContainerName='" + ContainerName + "' and OwnerName='" + OwnerName + "'");

                
foreach (ManagementObject oManObject in Q)
                {
                    oManObject.Delete();
                    errMessage 
= "MX记录:" + OwnerName + "删除成功.";
                    
return true;
                }
                
return false;
            }
            
catch (Exception e)
            {
                errMessage 
= e.Message;
                Console.WriteLine(e.ToString());
                
return false;
            }
        }


        
/// <summary>
        
/// 判断在某MicrosoftDNS_CNAMEType是否在指定的域中存在
        
/// </summary>
        
/// <param name="ContainerName">主域名 主域 Name of the Container for the Zone, Cache, or RootHints instance that contains this RR.</param>
        
/// <param name="OwnerName">Owner name for the RR. </param>
        
/// <returns></returns>
        public bool IsExistsCNAMEType(string ContainerName, string OwnerName)
        {
            
try
            {

                Q 
= QueryDNS("Select * From MicrosoftDNS_CNAMEType Where ContainerName='" + ContainerName + "' and OwnerName='" + OwnerName + "'");

                
foreach (ManagementObject oManObject in Q)
                {
                    
//  Console.WriteLine(oManObject["MailExchange"].ToString());
                    return true;
                }
                
return false;
            }
            
catch (Exception e)
            {
                errMessage 
= e.Message;
                Console.WriteLine(e.ToString());
                
return false;
            }
        }

        
/// <summary>
        
/// 创建MicrosoftDNS_CNAMEType记录(别名)
        
/// </summary>
        
/// <param name="HostName">主机名 [如果为空或NULL,主机名将与域名保持一致.]</param>
        
/// <param name="ContainerName">主域 Name of the Container for the Zone, Cache, or RootHints instance that contains this RR.</param>
        
/// <param name="PrimaryName">in] Primary name of the CNAME RR</param>
        
/// <param name="TTL">Time, in seconds, that the RR can be cached by a DNS resolver</param>
        
/// <returns></returns>
        public bool CreateCNAMEType(string HostName, string ContainerName, string PrimaryName,  string TTL)
        {
            
try
            {
                
string OwnerName = null;
                
if (string.IsNullOrEmpty(HostName))
                {
                    OwnerName 
= ContainerName;
                }
                
else
                {
                    OwnerName 
= HostName + "." + ContainerName;
                }

                
this.Create("MicrosoftDNS_CNAMEType");
                
//如果区域不存在
                if (!IsExistsZone(ContainerName))
                {
                    Console.WriteLine(
"区域:{0}不存在,创建失败", ContainerName);
                    errMessage 
= string.Format("区域:{0}不存在,创建失败", ContainerName);
                    
return false;
                }
                
if (IsExistsCNAMEType(ContainerName, OwnerName))
                {
                    Console.WriteLine(
"{0}中已存在{1},创建失败", ContainerName, OwnerName);
                    errMessage 
= string.Format("{0}中已存在{1},创建失败", ContainerName, OwnerName);
                    
return false;
                }

                MI 
= DnsClass.GetMethodParameters("CreateInstanceFromPropertyData");

                MI[
"DnsServerName"= "localhost";
                MI[
"ContainerName"= ContainerName;
                
// MI["RecordClass"] = 1;  //Default value is 1.  //1 IN (Internet)  //2 CS (CSNET)   //3 CH (CHAOS)   //4 HS (Hesiod) 
                MI["PrimaryName"= PrimaryName;
                MI[
"OwnerName"= OwnerName;

                
if (string.IsNullOrEmpty(TTL))
                {
                    TTL 
= "3600";
                }
                MI[
"TTL"= TTL;
                DnsClass.InvokeMethod(
"CreateInstanceFromPropertyData", MI, null);
                errMessage 
= "CNAME:" + OwnerName + "创建成功.";
                
return true;
            }
            
catch (Exception e)
            {
                errMessage 
= e.Message;
                Console.WriteLine(e.ToString());
                
return false;
            }
            
        }

        
/// <summary>
        
/// 修改MicrosoftDNS_CNAMEType记录(别名)
        
/// </summary>
        
/// <param name="HostName">主机名 [如果为空或NULL,主机名将与域名保持一致.]</param>
        
/// <param name="ContainerName">主域名 主域 Name of the Container for the Zone, Cache, or RootHints instance that contains this RR.</param>
        
/// <param name="TTL">[in, optional] Time, in seconds, that the RR can be cached by a DNS resolver. </param>
        
/// <param name="PrimaryName">in] Primary name of the CNAME RR</param>
        
/// <returns></returns>
        public bool ModifyCNAMEType(string HostName, string ContainerName, string TTL, string PrimaryName)
        {
            
try
            {
                
string OwnerName = null;
                
if (string.IsNullOrEmpty(HostName))
                {
                    OwnerName 
= ContainerName;
                }
                
else
                {
                    OwnerName 
= HostName + "." + ContainerName;
                }

                
this.Create("MicrosoftDNS_CNAMEType");
                
//如果区域不存在
                if (!IsExistsZone(ContainerName))
                {
                    Console.WriteLine(
"区域:{0}不存在,修改失败", ContainerName);
                    errMessage 
= string.Format("区域:{0}不存在,修改失败", ContainerName);
                    
return false;
                }
                
if (!IsExistsCNAMEType(ContainerName, OwnerName))
                {
                    Console.WriteLine(
"{0}中不存在{1},修改失败", ContainerName, OwnerName);
                    errMessage 
= string.Format("{0}中不存在{1},修改失败", ContainerName, OwnerName);
                    
return false;
                }
                Q 
= QueryDNS("Select * From MicrosoftDNS_CNAMEType Where ContainerName='" + ContainerName + "' and OwnerName='" + OwnerName + "'");
                
foreach (ManagementObject oManObject in Q)
                {
                    
if (ClearEndDot(oManObject["PrimaryName"].ToString()) == ClearEndDot(PrimaryName))
                    {
                        errMessage 
= "CName记录:" + OwnerName + "修改失败,必须修改别名主机.";
                        
return false;
                    }


                    MI 
= oManObject.GetMethodParameters("Modify");
                    
if (string.IsNullOrEmpty(TTL))
                    {
                        TTL 
= "3600";
                    }
                    MI[
"TTL"= TTL;
                    MI[
"PrimaryName"= PrimaryName;
                    oManObject.InvokeMethod(
"Modify", MI, null);
                    errMessage 
= "CNAME:" + OwnerName + "修改成功.";
                    
return true;
                }
                
return false;
            }
            
catch (Exception e)
            {
                errMessage 
= e.Message;
                Console.WriteLine(e.ToString());
                
return false;
            }
        }



        
/// <summary>
        
/// 删除MicrosoftDNS_CNAMEType
        
/// </summary>
        
/// <param name="HostName">主机名 [如果为空或NULL,主机名将与域名保持一致.]</param>
        
/// <param name="ContainerName">主域名 主域 Name of the Container for the Zone, Cache, or RootHints instance that contains this RR.</param>
        
/// <returns></returns>
        public bool DelCNAMEType(string HostName, string ContainerName)
        {
            
try
            {
                
string OwnerName = null;
                
if (string.IsNullOrEmpty(HostName))
                {
                    OwnerName 
= ContainerName;
                }
                
else
                {
                    OwnerName 
= HostName + "." + ContainerName;
                }

                
this.Create("MicrosoftDNS_CNAMEType");
                
//如果区域不存在
                if (!IsExistsZone(ContainerName))
                {
                    Console.WriteLine(
"区域:{0}不存在,删除失败", ContainerName);
                    errMessage 
= string.Format("区域:{0}不存在,删除失败", ContainerName);
                    
return false;
                }
                
if (!IsExistsCNAMEType(ContainerName, OwnerName))
                {
                    Console.WriteLine(
"{0}中不存在{1},删除失败", ContainerName, OwnerName);
                    errMessage 
= string.Format("{0}中不存在{1},删除失败", ContainerName, OwnerName);
                    
return false;
                }
                Q 
= QueryDNS("Select * From MicrosoftDNS_CNAMEType Where ContainerName='" + ContainerName + "' and OwnerName='" + OwnerName + "'");

                
foreach (ManagementObject oManObject in Q)
                {
                    oManObject.Delete();
                    errMessage 
= "CNAME:" + OwnerName + "删除成功.";
                    
return true;
                }
                
return false;
            }
            
catch (Exception e)
            {
                errMessage 
= e.Message;
                Console.WriteLine(e.ToString());
                
return false;
            }
        }


        
/// <summary>
        
/// 去除以.结尾的字符串的.
        
/// </summary>
        
/// <param name="str"></param>
        
/// <returns></returns>
        private string ClearEndDot(string str)
        {
            
string returnStr = str;
            
if (!string.IsNullOrEmpty(str))
            {
                
int l = str.LastIndexOf(".");
                
if (l != -1 && l == str.Length - 1)
                {
                    returnStr 
= str.Substring(0, str.Length - 1);
                }
            }
            
return returnStr;
        }

    }
}



posted on 2006-11-04 21:15  yaosansi  阅读(2071)  评论(15编辑  收藏  举报