首页 | 旅游 | 健康 | 时尚 | 下载 | 论坛 | 图文 | 专题 | 地图
资讯 IT人 电脑入门 操作系统 上网 办公 技巧 硬件 软件 网络 图像 多媒体 程序 数据库 网页制作 网站开发 网游 安全 加密 企业

.NET实现对DNS服务器的管理

巧巧读书 2010-01-21   技术论坛

  最近在做一个虚拟机的web管理系统,中间遇到一个问题,就是新建的虚拟机不能通过主机名访问,原因是DNS出了问题,没有对应的主机名和IP地址的记录,网络这边暂时又解决不了,只能把这个问题交给我们,让我们通过程序来实现记录的添加与删除了。

  解决方案

  1)通过powershell编程来实现。

  2)用.net编程来实现。

  我找了下.net关于DNS的类库,但没有相应的方法,只能通过WMI编程来间接实现了。

  using System;

  using System.Collections.Generic;

  using System.Text;

  using System.Management;

  using System.Data;

  namespace TestDNS

  {

  public  class DNSManage

  {

  #region filed

  private string sServerPath;

  private string username = null;

  private string password = null;

  private string DNSName = null;

  private ManagementScope DNS;

  private System.Management.ManagementObjectCollection Q;

  private ManagementClass DnsClass;

  private ManagementBaseObject MI;

  private string errMessage = null;

  #endregion

  #region property

  public string ErrMessage

  {

  get

  {

  return errMessage;

  }

  }

  public string ServerName

  {

  set

  {

  this.sServerPath = string.Format(@"\\{0}\root\MicrosoftDNS", value);

  this.DNSName = value;

  }

  }

  public string userName

  {

  set

  {

  this.username = value;

  }

  }

  public string passWord

  {

  set

  {

  this.password = value;

  }

  }

  #endregion

  public DNSManage()

  {

  sServerPath = @"\\localhost\root\MicrosoftDNS";

  DNSName = "localhost";

  }

  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();

  }

  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();

  }

  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);

  }

  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;

  }

  }

  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)

  {

  return true;

  }

  return false;

  }

  catch (Exception e)

  {

  errMessage = e.Message;

  Console.WriteLine(e.ToString());

  return false;

  }

  }

  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))

  {

  errMessage = string.Format("domain:{0} is not exist", ContainerName);

  return false;

  }

  if (IsExistsAType(ContainerName, OwnerName))

  {

  errMessage = string.Format("{0} exist in {1}", OwnerName, ContainerName);

  return false;

  }

  MI = DnsClass.GetMethodParameters("CreateInstanceFromPropertyData");

  MI["DnsServerName"] = DNSName;

  MI["ContainerName"] = ContainerName;

  MI["OwnerName"] = OwnerName;

  MI["IPAddress"] = IPAddress;

  if (string.IsNullOrEmpty(TTL))

  {

  TTL = "3600";

  }

  MI["TTL"] = TTL;

  DnsClass.InvokeMethod("CreateInstanceFromPropertyData", MI, null);

  errMessage = "add " + OwnerName + " success.";

  return true;

  }

  catch (Exception e)

  {

  errMessage = e.Message;

  Console.WriteLine(e.ToString());

  return false;

  }

  }

  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))

  {

  errMessage = string.Format("domain:{0} is not exist", ContainerName);

  return false;

  }

  if (IsExistsAType(ContainerName, OwnerName))

  {

  errMessage = string.Format("{0} exist in {1}", OwnerName, ContainerName);

  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 = "add " + OwnerName + " success.";

  return true;

  }

  catch (Exception e)

  {

  errMessage = e.Message;

  Console.WriteLine(e.ToString());

  return false;

  }

  }

  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))

  {

  errMessage = string.Format("domain:{0} is not exist", ContainerName);

  return false;

  }

  if (!IsExistsAType(ContainerName, OwnerName))

  {

  errMessage = string.Format("{0} not exist in {1}", OwnerName, ContainerName);

  return false;

  }

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

  foreach (ManagementObject oManObject in Q)

  {

  if (oManObject["IPAddress"].ToString() == IPAddress)

  {

  errMessage =  OwnerName + " ipaddress is same.";

  return false;

  }

  MI = oManObject.GetMethodParameters("Modify");

  MI["IPAddress"] = IPAddress;

  MI["TTL"] = TTL;

  oManObject.InvokeMethod("Modify", MI, null);

  errMessage = "modify " + OwnerName + " success.";

  return true;

  }

  errMessage = string.Format("{0} failed", OwnerName);

  return false;

  }

  catch (Exception e)

  {

  errMessage = e.Message;

  Console.WriteLine(e.ToString());

  return false;

  }

  }

  public bool DelAType(string ContainerName, string HostName)

  {

  try

  {

  string OwnerName = null;

  if (string.IsNullOrEmpty(HostName))

  {

  OwnerName = ContainerName;

  }

  else

  {

  OwnerName = HostName + "." + ContainerName;

  }

本类最热图文
巧巧读书图文推荐
Google
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章