您的位置:首页 > 其它

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

2010-01-20 11:40 176 查看
最近在做一个虚拟机的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;
}

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)
{
oManObject.Delete();

return true;
}
errMessage = string.Format("{0}:{1},error", ContainerName, OwnerName);
return false;
}
catch (Exception e)
{
errMessage = e.Message;
Console.WriteLine(e.ToString());
return false;
}
}

public DataTable ListExistsAType(string ContainerName)
{

DataTable table = new DataTable("MicrosoftDNS_AType" + ContainerName);
table.Columns.Add("OwnerName");
table.Columns.Add("IPAddress");
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["OwnerName"] = oManObject["OwnerName"];
row["IPAddress"] = oManObject["IPAddress"];
row["TTL"] = oManObject["TTL"];
table.Rows.Add(row);
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
}
catch (Exception e)
{
errMessage = e.Message;
Console.WriteLine(e.ToString());
}

return table;
}

public bool Test(string ContainerName, string HostName, string IPAddress)
{
string TTL = "3600";
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))
{
this.CreateAType(ContainerName, HostName, IPAddress, TTL);
return true;
}

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 not be modifid.";
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;
}

return false;
}

}
}

这个是我好不容易从网上搜到的,大家也可以参考http://www.jb51.net/article/8045.htm
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: