我正在尝试通过C ++程序进行动态DNS更新。该代码在Windows客户端上执行,并且该客户端是本地域 kastravec.loc 的一部分,并连接到本地Windows DNS服务器。从理论上讲,该程序应该能够使用 Dnsapi.lib Win-Library(属于 Dnsapi.lib 组件)的 DnsModifyRecordsInSet API函数在Windows DNS服务器上设置新的DNS记录。参见下面的代码)。但是,当尝试执行该代码时,该函数将返回9002系统错误代码(DNS服务器故障)。通过Wireshark观察到的DNS流量表明相同:
回复代码:服务器故障(2)
其他一些注释:
我非常感谢您的回答,因为在msdn docs和code 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)解决了该问题。