最近在做一个虚拟机的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