【 tulaoshi.com - 编程语言 】
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();
}
}
}
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}rootMicrosoftDNS", 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 = @"localhostrootMicrosoftDNS";
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 + "修改成功.";