我有一台 Windows 2008 R2 Enterprise 计算机(我们假设它的计算机名称设置为“MYSERVER”),运行 DNS 服务器角色 - 它不在域中(系统将其显示为名为“WORKGROUP”的工作组中)。
我希望它在 DNS 配置中显示为“ns1.mydomain.com”而不是“MYSERVER”-mydomain.com 是一个外部“正常”域,它并不隔离到内部网或防火墙后面或任何东西。
添加角色后,我首先查看了 DNS 配置,但没有看到任何可以更改名称属性的内容。
我尝试通过 WMI 更改它,但没有成功 -MicrosoftDNS_Server 类的 MSDN 页面将 Name 属性列为只读,我猜这就是更新未生效的原因。
如果有必要,可以重新安装 DNS 角色(如果角色安装/激活/运行后无法更改),但我也不知道如何在角色安装期间对其进行配置。
谢谢!
答案1
这不是我想要的答案,但由于我提到问题是自动生成的 SOA 和 NS 记录,所以我还想包括在区域创建后修复它们的代码。
我没有修改这个问题,因为我不想混淆实际的问题,但万一将来有人遇到这个问题而到那时还没有更好的答案,至少这对他们来说是一个潜在的解决方法。
public void FixupResourceRecords()
{
var resourceRecordClass = new ManagementClass(@"\\localhost\root\MicrosoftDNS:MicrosoftDNS_ResourceRecord");
var oldServerName = ...;
var newServerName = ...;
var search = " " + oldServerName.ToLower() + ".";
var replace = " " + newServerName.ToLower() + ".";
// we want the subclasses too (including SOA and NS records)
var options = new EnumerationOptions() { EnumerateDeep = true };
var allResourceRecords = resourceRecordClass.GetInstances(options).Cast<ManagementObject>().ToList();
Console.WriteLine("Checking {0} resource records", allResourceRecords.Count);
var resourceRecordsToFix = (
from record in allResourceRecords
let textVersion = record["TextRepresentation"].ToString().ToLower()
let replacedVersion = textVersion.Replace(search, replace)
where replacedVersion != textVersion
select new
{
textVersion,
replacedVersion,
record,
}
).ToList();
Console.WriteLine("Fixing up {0} resource records", resourceRecordsToFix.Count);
resourceRecordsToFix.ForEach(tuple =>
{
// first delete the old one
tuple.record.Delete();
resourceRecordClass.InvokeMethod("CreateInstanceFromTextRepresentation", new object[]
{
tuple.record["DnsServerName"],
tuple.record["ContainerName"],
tuple.replacedVersion,
});
});
}