2011-05-26 58 views
3

我想我可能需要创建一个工具来协助迁移DNS信息,为我们的2003和2008服务器的林中创建“阴影”区域,用于NAT加入的内容等等。是否有.NET接口来编辑Windows DNS服务器区域?

我知道有办法可以access Windows DNS via WMI (and thus through PowerShell, WSH, etc.,但是有更好的.NET高级选项吗?

除了Microsoft的“安全更新”的要求之外,我会考虑更灵活的语言(例如Python)和库(例如BIND)。

+0

请注意,有一个[类似的问题寻找DNS库的.NET库](http://stackoverflow.com/questions/4538490/what-dns-libraries-are-there-in-net),但不是Windows DNS服务器。 – ewall 2011-05-26 19:34:57

+0

Bueller ...任何人? Bueller?任何人? – ewall 2011-06-08 16:07:39

回答

3

以下文章是否可以帮助你?它提供了一些代码来处理与MS DNS服务器的通话。

http://social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/d7af771b-7c6b-4ee8-acfb-28a12bc1c5e7/

粘贴低于它们的C#为便于参考。请注意,如果您在DNS本身在本地运行这段代码,那么你需要删除调用此代码时,下面的认证证书部分...(即DnsProvider dns = new DnsProvider("localhost",null,null);

using System; 
using System.Management; 
namespace DNS 
{ 
public class DnsProvider 
{ 
#region Members 
private ManagementScope Session=null; 
public string Server=null; 
public string User=null; 
private string Password=null; 
private string m_NameSpace=null; 
#endregion 
public DnsProvider(string serverName,string userName,string password) 
{ 
this.Server=serverName; 
this.User=userName; 
this.Password=password; 
this.Logon(); 
this.Initialize(); 
} 
private void Logon() 
{ 
this.m_NameSpace="\\\\" + this.Server + "\\root\\microsoftdns"; 
ConnectionOptions con=new ConnectionOptions(); 
con.Username=this.User; 
con.Password=this.Password; 
con.Impersonation=ImpersonationLevel.Impersonate; 
this.Session=new ManagementScope(this.NameSpace); 
this.Session.Options=con; 
this.Session.Connect(); 
} 
private void Initialize() 
{ 
} 
#region Methods 
public void Dispose() 
{ 
} 
public void Dispose(ref ManagementClass x) 
{ 
if(x!=null) 
{ 
x.Dispose(); 
x=null; 
} 
} 
public void Dispose(ref ManagementBaseObject x) 
{ 
if(x!=null) 
{ 
x.Dispose(); 
x=null; 
} 
} 
public bool DomainExists(string domainName) 
{ 
bool retval=false; 
string wql=""; 
wql="SELECT *"; 
wql+=" FROM MicrosoftDNS_ATYPE"; 
wql+=" WHERE OwnerName = '" + domainName + "'"; 
ObjectQuery q=new ObjectQuery(wql); 
ManagementObjectSearcher s=new ManagementObjectSearcher(this.Session,q); 
ManagementObjectCollection col=s.Get(); 
int total=col.Count; 
foreach(ManagementObject o in col) 
{ 
retval=true; 
} 
return retval; 
} 
public void AddDomain(string domainName,string ipDestination) 
{ 
//check if domain already exists 
if(this.DomainExists(domainName)) 
{ 
throw new Exception("The domain you are trying to add already exists on this server!"); 
} 
//generate zone 
ManagementClass man=this.Manage("MicrosoftDNS_Zone"); 
ManagementBaseObject ret=null; 
ManagementBaseObject obj=man.GetMethodParameters("CreateZone"); 
obj["ZoneName"]=domainName; 
obj["ZoneType"]=0; 
//invoke method, dispose unneccesary vars 
man.InvokeMethod("CreateZone",obj,null); 
this.Dispose(ref obj); 
this.Dispose(ref ret); 
this.Dispose(ref man); 
//add rr containing the ip destination 
this.AddARecord(domainName,null,ipDestination); 
} 
public void RemoveDomain(string domainName) 
{ 
string wql=""; 
wql="SELECT *"; 
wql+=" FROM MicrosoftDNS_Zone"; 
wql+=" WHERE Name = '" + domainName + "'"; 
ObjectQuery q=new ObjectQuery(wql); 
ManagementObjectSearcher s=new ManagementObjectSearcher(this.Session,q); 
ManagementObjectCollection col=s.Get(); 
int total=col.Count; 
foreach(ManagementObject o in col) 
{ 
o.Delete(); 
} 
} 
public void AddARecord(string domain,string recordName,string ipDestination) 
{ 
if(this.DomainExists(recordName + "." + domain)) 
{ 
throw new Exception("That record already exists!"); 
} 
ManagementClass man=new ManagementClass(this.Session,new ManagementPath("MicrosoftDNS_ATYPE"),null); 
ManagementBaseObject vars=man.GetMethodParameters("CreateInstanceFromPropertyData"); 
vars["DnsServerName"]=this.Server; 
vars["ContainerName"]=domain; 
if(recordName==null) 
{ 
vars["OwnerName"]=domain; 
} 
else 
{ 
vars["OwnerName"]=recordName + "." + domain; 
} 
vars["IPAddress"]=ipDestination; 
man.InvokeMethod("CreateInstanceFromPropertyData",vars,null); 
} 
public void RemoveARecord(string domain,string aRecord) 
{ 
string wql=""; 
wql="SELECT *"; 
wql+=" FROM MicrosoftDNS_ATYPE"; 
wql+=" WHERE OwnerName = '" + aRecord + "." + domain + "'"; 
ObjectQuery q=new ObjectQuery(wql); 
ManagementObjectSearcher s=new ManagementObjectSearcher(this.Session,q); 
ManagementObjectCollection col=s.Get(); 
int total=col.Count; 
foreach(ManagementObject o in col) 
{ 
o.Delete(); 
} 
} 
#endregion 
#region Properties 
public string NameSpace 
{ 
get 
{ 
return this.m_NameSpace; 
} 
} 
public bool Enabled 
{ 
get 
{ 
bool retval=false; 
try 
{ 
SelectQuery wql=new SelectQuery(); 
wql.QueryString=""; 
} 
catch 
{} 
return retval; 
} 
} 
public ManagementClass Manage(string path) 
{ 
//ManagementClass retval=new ManagementClass(path); 
ManagementClass retval=new ManagementClass(this.Session,new ManagementPath(path),null); 
return retval; 
} 
#endregion 
} 
} 
+0

噢,那正是我要找的那种东西。另外,它不是“完成”,所以我得到更多的摆弄它;)感谢 - – ewall 2011-06-17 18:30:31

+0

什么是serverName?服务器的IP地址? – 2014-05-27 20:15:28

0

我期待解决类似的代码的挑战,我发现这个项目在CodePlex上:

http://dnsapi.codeplex.com/

似乎更加完整,同时还没有完全落实。