具有DnsModifyRecordsInSet API函数的DNS动态更新

时间:2018-08-08 11:25:35

标签: c++ winapi dns

我正在尝试通过C ++程序进行动态DNS更新。该代码在Windows客户端上执行,并且该客户端是本地域 kastravec.loc 的一部分,并连接到本地Windows DNS服务器。从理论上讲,该程序应该能够使用 Dnsapi.lib Win-Library(属于 Dnsapi.lib 组件)的 DnsModifyRecordsInSet API函数在Windows DNS服务器上设置新的DNS记录。参见下面的代码)。但是,当尝试执行该代码时,该函数将返回9002系统错误代码(DNS服务器故障)。通过Wireshark观察到的DNS流量表明相同:

  

回复代码:服务器故障(2)

其他一些注释:

  • 使用cli工具 nsupdate 进行动态DNS更新
  • 为了进行测试,安全的动态DNS被禁用

我非常感谢您的回答,因为在msdn docscode sample from 2000旁边关于该主题的信息很少。

#include "stdafx.h"
#include <iostream>
#include "windows.h"
#include "stdio.h"
#include "windns.h"
#include "winsock.h"

using namespace std;

int main()
{
    DNS_STATUS dnsStatus;
    PDNS_RECORD pDnsRecord = NULL;
    PCWSTR serverRecord = L"adserver01.kastravec.loc";
    PWSTR pDnsName = NULL; 
    PIP4_ARRAY pSrvList = NULL;
    pDnsRecord = (PDNS_RECORD)LocalAlloc(LPTR, sizeof(DNS_RECORD));

    if (!pDnsRecord) {
        printf("Memory allocaltion failed\n");
        exit(1);
    }


    wstring dnsName = L"testka.kastravec.loc";
    pDnsName = _wcsdup(dnsName.c_str()); 

    wstring wstrTest = L"Keine Ahnung, test";
    wchar_t* wcharTest = _wcsdup(wstrTest.c_str());

    pDnsRecord->pName = pDnsName;
    pDnsRecord->wType = DNS_TYPE_A;
    pDnsRecord->wDataLength = sizeof(DNS_A_DATA);
    pDnsRecord->dwTtl = 86500;
    pDnsRecord->Data.A.IpAddress = inet_addr("192.168.56.11");

    if (pDnsRecord->Data.A.IpAddress == INADDR_NONE) {
        printf("Invalid IP address in A record data \n");
    }

    pSrvList = (PIP4_ARRAY)LocalAlloc(LPTR, sizeof(IP4_ARRAY));
    if (!pSrvList) {
        printf("Memory allocation failed \n");
        exit(1);
    }
    pSrvList->AddrCount = 1;
    pSrvList->AddrArray[0] = inet_addr("192.168.56.5"); //DNS server IP address

    dnsStatus = DnsModifyRecordsInSet_A(pDnsRecord,                     //pointer to DNS_RECORD
        NULL,
        DNS_UPDATE_SECURITY_OFF,  //do not attempt secure dynamic updates
        NULL,                             //use default credentials
        pSrvList,                         //contains DNS server IP address
        NULL);                            //reserved for future use

    return 0;
}

编辑:

发现了问题。我使用了错误的功能版本。我使用了ANSI版本的 DnsModifyRecordsInSet_A 。使用 DnsModifyRecordsInSet_W (Unicode)解决了该问题。

0 个答案:

没有答案