2010-09-22 67 views
8

我正在使用WMI创建不同类型的DNS记录,但遇到SRV记录问题。每当我通过DomainName参数时,我总是收到“未找到”错误。该域名看起来不错。如何使用C#在DNS中创建SRV记录

有没有人曾经成功地做过这件事?

这里是我的代码:

internal static void CreateSrvRecordInDns(string Zone, string OwnerName, string DomainName, UInt16 Weight, UInt16 Priority, UInt16 Port) 
    { 
     DnsProvider dns = new DnsProvider(); 
     ManagementClass mClass = new ManagementClass(dns.Session, new ManagementPath("MicrosoftDNS_SrvType"), null); 
     ManagementBaseObject inParams = mClass.GetMethodParameters("CreateInstanceFromPropertyData"); 
     inParams["DnsServerName"] = dns.Server; 
     inParams["ContainerName"] = Zone; 
     inParams["OwnerName"] = OwnerName; 
     inParams["DomainName"] = DomainName; //Error occurs here 
     inParams["Port"] = Port; 
     inParams["Priority"] = Priority; 
     inParams["Weight"] = Weight; 
     mClass.InvokeMethod("CreateInstanceFromPropertyData", inParams, null); 
     dns.Dispose(ref inParams); 
     dns.Dispose(ref mClass); 
    } 
+0

你传递的域名是什么? – CodingGorilla 2010-09-22 18:55:25

+0

_tcp._finger。parentdomain – mcass20 2010-09-22 18:57:50

+0

你的意思是* _finger._tcp.parentdomain *? [rfc2782](http://tools.ietf.org/html/rfc2782) – dtb 2010-09-22 19:00:18

回答

4

只需将其替换有问题的行:

inParams["SRVDomainName"] = DomainName; 

我不知道原因,但是当拿到属性列表:

PropertyData[] pd = new PropertyData[inParams.Properties.Count]; 
inParams.Properties.CopyTo(pd,0); 

这是名(微软的bug?)

HTH。

P.S.为了看到每个字段的正确的格式,使用WBEMTEST工具(从命令提示符WBEMTEST),连接到root \ MicrosoftDNS命名空间,运行以下查询:

Select * from MicrosoftDNS_SRVType 

您应该使用相同的格式实例上市在答案中)。

+0

谢谢!对于这两个解决方案,并引起我的注意wbemtest工具。 – mcass20 2010-10-05 15:40:16

0

正确的SRV记录将_finger._tcp.example.com

我不知道WMI,但系统可能要求您首先为_tcp.example.com创建“空的非终端”节点。

编辑

我相信我现在看到的问题 - 你OwnerName场应该是包含_finger._tcp.example.com之一。 DomainName字段应该包含SRV记录的目标

http://msdn.microsoft.com/en-us/library/ms682736%28v=VS.85%29.aspx

+0

感谢您的建议。我已经尝试创建域名,但无济于事。当我尝试传递DomainName参数时,我仍然收到相同的错误。 – mcass20 2010-09-23 16:27:35

+0

如果您尝试使用下划线,会发生什么情况? WMI可能错误地认为它们不合法。 – Alnitak 2010-09-23 16:58:28

+0

再次感谢,但仍然没有运气。我认为我是唯一一个尝试过这样的人。 – mcass20 2010-09-23 19:14:32

2

我想补充一点在这里为那些谁仍然无法得到它的细节...

如果您域名google.com如果记录是: _finger._tcp.google.com指向目标主机hello.google.com则变量和它们的值将作为下:

inParams["DnsServerName"] = dns.Server; 
    inParams["ContainerName"] = Zone; //google.com 
    inParams["OwnerName"] = OwnerName; //_finger._tcp.google.com 
    // Can't set domain name like this, leave this field 
    //inParams["DomainName"] = DomainName; //_tcp.google.com 
    //Set Target SRV Host here which is providing the service,,, 
    inParams["SRVDomainName"] = DomainName; //target Host : hello.google.com 

    inParams["Port"] = Port; 
    inParams["Priority"] = Priority; 
    inParams["Weight"] = Weight; 

我已经通过创建示例应用程序并创建区域google.com并设置了SRV记录及其值,如上所述进行了测试。我希望这对那些听到其他答复的人听起来有点不那么具有说服力。

+0

更正了一个错误。尝试创建SRV记录时设置DomainName不正确!要设置TargetHost,必须设置SRVDomainName属性,该属性很遗憾没有记录在任何地方...... :( – 2011-05-28 12:25:28

相关问题