Question

I am using WMI to create different types of DNS records but am having a problem with SRV records. I keep getting a "Not found" error whenever I pass the DomainName parameter. The domain name looks good to me.

Has anyone ever successfully done this?

Here is my code:

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);
    }
Was it helpful?

Solution

Simply replace the problematic line with:

inParams["SRVDomainName"] = DomainName;

I don't know the reason, but when got the properties list by:

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

This was the name of this field (Microsoft's bug?)

HTH.

P.S. In order to see the right format for each field, use wbemtest tool (wbemtest from command prompt), connect to root\MicrosoftDNS namespace and run the following query:

Select * from MicrosoftDNS_SRVType

You should use the same format as the instances listed in the answer).

OTHER TIPS

I would like to add a bit of detail here for those who are still unable to get it...

If your domain Name is google.com and if the Record is : _finger._tcp.google.com pointing towards target host : hello.google.com then the variables and their values will be as under:

    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;

I have tested in by creating a sample application and creating zone google.com and setting an SRV record and its values as mentioned up. I hope it helps to those to whom other replies may sound it bit less explanatory.

The correct SRV record would be _finger._tcp.example.com.

I don't know WMI, but the system may be requiring you to create the "empty non-terminal" node for _tcp.example.com first.

EDIT

I believe I see the problem now - your OwnerName field should be the one to contain _finger._tcp.example.com. The DomainName field is supposed to contain the target of the SRV record.

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

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top