现在的位置: 首页 > 综合 > 正文

在C#中利用wmi操作DNS服务器

2018年03月19日 ⁄ 综合 ⁄ 共 15905字 ⁄ 字号 评论关闭
public class DNSAdminLib
    {
        //要连接的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>
        /// DNS服务器名称或IP地址
        /// </summary>
        public string ServerName
        {
            set
            {
                this.sServerPath = string.Format(@"//{0}/root/MicrosoftDNS", value);
                this.DNSName = value;
            }
        }

        /// <summary>
        /// 连接服务器的用户名
        /// </summary>
        public string userName
        {
            set
            {
                this.username = value;
            }
        }

        /// <summary>
        /// 连接服务器的密码
        /// </summary>
        public string passWord
        {
            set
            {
                this.password = value;
            }
        }

        //构造函数
        public DNSAdminLib()
        {
            sServerPath = @"//localhost/root/MicrosoftDNS";
            DNSName = "localhost";

        }

        /// <summary>
        /// 建立对象.连接
        /// </summary>
        /// <param name="DnsType">DNS类型 MicrosoftDNS_Zone等</param>
        private void Create(string DnsType)
        {
            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)
        {
            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
            {
                return false;
            }

        }

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

                ManagementBaseObject OutParams = this.DnsClass.InvokeMethod("CreateZone", MI, null);
                return true;
            }
            catch
            {
                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))
                {
                    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);
                return true;
            }
            catch
            {
                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);
                    return true;
                }
                return false;
            }
            catch
            {
                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();
                    return true;
                }
                return false;
            }
            catch
            {
                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
            {
                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="OwnerName">Owner name for the RR</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 ContainerName, string OwnerName, string IPAddress)
        {
            try
            {
                this.Create("MicrosoftDNS_AType");
                //如果区域不存在
                if (!IsExistsZone(ContainerName))
                {
                    Console.WriteLine("区域:{0}不存在,创建失败", ContainerName);
                    return false;
                }
                if (IsExistsAType(ContainerName, OwnerName))
                {
                    Console.WriteLine("{0}中已存在{1},创建失败", ContainerName, OwnerName);
                    return false;
                }
                MI = DnsClass.GetMethodParameters("CreateInstanceFromPropertyData");
                MI["DnsServerName"] = "localhost";
                MI["ContainerName"] = ContainerName;
                MI["OwnerName"] = OwnerName;
                MI["IPAddress"] = IPAddress;
                MI["TTL"] = 3600;
                DnsClass.InvokeMethod("CreateInstanceFromPropertyData", MI, null);
            }
            catch
            {
            }
            return true;
        }

        /// <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="OwnerName">Owner name for the RR</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 OwnerName, uint RecordClass, uint TTL, string IPAddress)
        {
            try
            {
                this.Create("MicrosoftDNS_AType");
                //如果区域不存在
                if (!IsExistsZone(ContainerName))
                {
                    Console.WriteLine("区域:{0}不存在,创建失败", ContainerName);
                    return false;
                }
                if (IsExistsAType(ContainerName, OwnerName))
                {
                    Console.WriteLine("{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);
                return true;
            }
            catch
            {
                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="OwnerName">Owner name for the RR</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 OwnerName, string IPAddress)
        {
            try
            {
                Q = QueryDNS("Select * From MicrosoftDNS_AType where ContainerName='" + ContainerName + "' and OwnerName='" + OwnerName + "'", "MicrosoftDNS_AType");

                foreach (ManagementObject oManObject in Q)
                {
                    MI = oManObject.GetMethodParameters("Modify");
                    MI["IPAddress"] = IPAddress;
                    oManObject.InvokeMethod("Modify", MI, null);
                    return true;
                }
                return false;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
                return false;
            }
        }

        /// <summary>
        /// Made by yaosansi 2005.9 in n169.com
        /// </summary>
        /// <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="OwnerName">Owner name for the RR</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 OwnerName, uint TTL, string IPAddress)
        {
            try
            {
                Q = QueryDNS("Select * From MicrosoftDNS_AType where ContainerName='" + ContainerName + "' and OwnerName='" + OwnerName + "'", "MicrosoftDNS_AType");

                foreach (ManagementObject oManObject in Q)
                {
                    MI = oManObject.GetMethodParameters("Modify");
                    MI["TTL"] = TTL;
                    MI["IPAddress"] = IPAddress;
                    oManObject.InvokeMethod("Modify", MI, null);
                    return true;
                }
                return false;
            }
            catch
            {
                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="OwnerName">Owner name for the RR</param>
        /// <returns></returns>
        public bool DelAType(string ContainerName, string OwnerName)
        {
            try
            {
                Q = QueryDNS("Select * From MicrosoftDNS_AType where ContainerName='" + ContainerName + "' and OwnerName='" + OwnerName + "'", "MicrosoftDNS_AType");

                foreach (ManagementObject oManObject in Q)
                {
                    oManObject.Delete();
                    return true;
                }
                return false;
            }
            catch
            {
                return false;
            }
        }
    }

抱歉!评论已关闭.