C++ 在windows上使用Win32 API修改dns缓存(无主机文件)
我需要修改dns缓存,例如,将www.microsoft.com重定向到111.222.333.444。而不是通过修改etc/hosts文件 我看到ipconfig/displaydns正在输出dns缓存,它由一个名为“dns客户端”的服务维护,我可以修改缓存吗 谷歌说有一个APIDnsModifyRecordsInSet可以完成这项工作,还有一个来自sdk的示例:C++ 在windows上使用Win32 API修改dns缓存(无主机文件),c++,dns,C++,Dns,我需要修改dns缓存,例如,将www.microsoft.com重定向到111.222.333.444。而不是通过修改etc/hosts文件 我看到ipconfig/displaydns正在输出dns缓存,它由一个名为“dns客户端”的服务维护,我可以修改缓存吗 谷歌说有一个APIDnsModifyRecordsInSet可以完成这项工作,还有一个来自sdk的示例:MicrosoftSDK\uuxamples\netds\DNS\ModifyRecords,我尝试了这个示例,但它抱怨不同网站的错
MicrosoftSDK\uuxamples\netds\DNS\ModifyRecords
,我尝试了这个示例,但它抱怨不同网站的错误代码为9005/9004/9002/9009,下面是命令行:
test.exe -n www.microsoft.com -t A -l 360 -d 127.0.0.1
Failed to add the host record for www.microsoft.com and the error is 9004
test.exe -n www.bing.com -t A -l 360 -d 127.0.0.1
Failed to add the host record for www.bing.com and the error is 9009
test.exe -n www.test.com -t A -l 360 -d 127.0.0.1
Failed to add the host record for www.test.com and the error is 9002
....
代码如下:
#include <windows.h> //windows
#include <windns.h> //DNS api's
#include <stdio.h> //standard i/o
#include <winsock.h> //winsock
#define BUFFER_LEN 255
//Usage of the program
void Usage(char *progname) {
fprintf(stderr,"Usage\n%s -n [OwnerName] - t [Type] -l [Ttl] -d [Data] -s [DnsServerIp]\n",
progname);
fprintf(stderr,"Where:\n\tOwnerName is the owner field to be added\n");
fprintf(stderr,"\tType is the type of resource record to be added A or CNAME\n");
fprintf(stderr,"\tData is the data corresponding to RR to be added\n");
fprintf(stderr,"\tTtl is the time to live value in seconds \n");
fprintf(stderr,"\tDnsServerIp is the ipaddress of DNS server (in dotted decimal notation)\n");
exit(1);
}
// the main function
void __cdecl main(int argc, char *argv[])
{
DNS_STATUS status; // return value of DnsModifyRecordsInSet() function.
PDNS_RECORD pmyDnsRecord = NULL; //pointer to DNS_RECORD structure
PIP4_ARRAY pSrvList = NULL; //pinter to IP4_ARRAY structure
LPTSTR pOwnerName = NULL, pNameData = NULL; //owner name and the data for CNAME resource record
char HostipAddress[BUFFER_LEN]; //Ip address required to add host record
char DnsServIp[BUFFER_LEN]; //DNS server ip address
memset(HostipAddress, 0, sizeof(HostipAddress) );
memset(DnsServIp, 0, sizeof(DnsServIp) );
//Allocate memory for DNS_RECORD structure.
pmyDnsRecord = (PDNS_RECORD) LocalAlloc( LPTR, sizeof( DNS_RECORD ) );
if (!pmyDnsRecord) {
printf("Memory allocaltion failed\n");
exit(1);
}
if (argc > 8) {
for (int i = 1; i < argc ; i++) {
if ( (argv[i][0] == '-') || (argv[i][0] == '/') ) {
switch (tolower(argv[i][1])) {
case 'n':
pOwnerName = argv[++i];
pmyDnsRecord->pName = pOwnerName; //copy the Owner name information
break;
case 't':
if (!_stricmp(argv[i+1], "A") )
pmyDnsRecord->wType = DNS_TYPE_A; //add host records
else if (!_stricmp(argv[i+1], "CNAME") )
pmyDnsRecord->wType = DNS_TYPE_CNAME; //add CNAME records
else
Usage(argv[0]);
i++;
break;
case 'l':
pmyDnsRecord->dwTtl = atoi(argv[++i]); // time to live value in seconds
break;
case 'd':
if (pmyDnsRecord->wType == DNS_TYPE_A) {
pmyDnsRecord->wDataLength = sizeof(DNS_A_DATA); //data structure for A records
strncpy(HostipAddress, argv[++i], sizeof(HostipAddress)-1);
HostipAddress[sizeof(HostipAddress)-1] = '\0';
pmyDnsRecord->Data.A.IpAddress = inet_addr(HostipAddress); //convert string to proper address
if ( pmyDnsRecord->Data.A.IpAddress == INADDR_NONE ) {
printf("Invalid IP address in A record data \n");
Usage(argv[0]);
}
break;
}
else {
pmyDnsRecord->wDataLength = sizeof(DNS_PTR_DATA); //data structure for CNAME records
pNameData = argv[++i];
pmyDnsRecord->Data.Cname.pNameHost = pNameData;
break;
}
case 's':
// Allocate memory for IP4_ARRAY structure
pSrvList = (PIP4_ARRAY) LocalAlloc(LPTR,sizeof(IP4_ARRAY));
if (!pSrvList) {
printf("Memory allocation failed \n");
exit(1);
}
if (argv[++i]) {
strncpy(DnsServIp,argv[i],sizeof(DnsServIp)-1);
DnsServIp[sizeof(DnsServIp)-1] = '\0';
pSrvList->AddrCount = 1;
pSrvList->AddrArray[0] = inet_addr(DnsServIp); //DNS server IP address
if ( pSrvList->AddrArray[0] == INADDR_NONE ) {
printf("Invalid DNS server IP address\n");
Usage(argv[0]);
}
break;
}
default:
Usage(argv[0]);
break;
}
}
else
Usage(argv[0]);
}
} else {
Usage(argv[0]);
}
// Calling function DNSModifyRecordsInSet_A to add Host or CNAME records
status = DnsModifyRecordsInSet_A(pmyDnsRecord, //pointer to DNS_RECORD
NULL,
DNS_UPDATE_SECURITY_USE_DEFAULT, //do not attempt secure dynamic updates
NULL, //use default credentials
pSrvList, //contains DNS server IP address
NULL); //reserved for future use
if (status) {
if (pmyDnsRecord->wType == DNS_TYPE_A)
printf("Failed to add the host record for %s and the error is %d \n", pOwnerName, status);
else
printf("Failed to add the Cname record for %s and the error is %d \n", pOwnerName, status);
}
else {
if (pmyDnsRecord->wType == DNS_TYPE_A)
printf("Successfully added the host record for %s \n", pOwnerName);
else
printf("Successfully added the Cname record for %s \n", pOwnerName);
}
LocalFree(pmyDnsRecord); // Free the memory allocated for DNS_RECORD structure
LocalFree(pSrvList); // Free the memory allocated for IP4_ARRAY structure
}
#包括//窗口
#包括//DNS api
#包括//标准i/o
#包括//winsock
#定义缓冲区长度255
//程序的使用
无效用法(char*progname){
fprintf(stderr,“用法\n%s-n[OwnerName]-t[Type]-l[Ttl]-d[Data]-s[DnsServerIp]\n”,
项目名称);
fprintf(stderr,“其中:\n\tOwnerName是要添加的所有者字段\n”);
fprintf(stderr,“\t类型是要添加的资源记录的类型或CNAME\n”);
fprintf(stderr,“\t数据是与要添加的RR相对应的数据\n”);
fprintf(stderr,“\tTtl是生存时间值,以秒为单位\n”);
fprintf(stderr,“\tDnsServerIp是DNS服务器的IP地址(以点十进制表示)\n”);
出口(1);
}
//主要功能
void uu cdecl main(int argc,char*argv[])
{
DNS_STATUS STATUS;//DnsModifyRecordsInSet()函数的返回值。
PDNS_RECORD pmyDnsRecord=NULL;//指向DNS_记录结构的指针
PIP4_数组pSrvList=NULL;//pinter到IP4_数组结构
LPTSTR pOwnerName=NULL,pNameData=NULL;//所有者名称和CNAME资源记录的数据
char HostipAddress[BUFFER_LEN];//添加主机记录所需的Ip地址
char DnsServIp[BUFFER_LEN];//DNS服务器ip地址
memset(HostipAddress,0,sizeof(HostipAddress));
memset(DnsServIp,0,sizeof(DnsServIp));
//为DNS_记录结构分配内存。
pmyDnsRecord=(PDNS_记录)LocalAlloc(LPTR,sizeof(DNS_记录));
如果(!pmyDnsRecord){
printf(“内存分配失败\n”);
出口(1);
}
如果(argc>8){
对于(int i=1;ipName=pOwnerName;//复制所有者名称信息
打破
案例“t”:
if(!\u stricmp(argv[i+1],“A”))
pmyDnsRecord->wType=DNS\u TYPE\u A;//添加主机记录
else if(!\u stricmp(argv[i+1],“CNAME”))
pmyDnsRecord->wType=DNS\u TYPE\u CNAME;//添加CNAME记录
其他的
用法(argv[0]);
i++;
打破
案例“l”:
pmyDnsRecord->dwTtl=atoi(argv[++i]);//生存时间值(秒)
打破
案例“d”:
如果(pmyDnsRecord->wType==DNS\u TYPE\u A){
pmyDnsRecord->wDataLength=sizeof(DNS_A_数据);//记录的数据结构
strncpy(HostipAddress,argv[++i],sizeof(HostipAddress)-1;
HostipAddress[sizeof(HostipAddress)-1]='\0';
pmyDnsRecord->Data.A.IpAddress=inet_addr(HostipAddress);//将字符串转换为正确的地址
如果(pmyDnsRecord->Data.A.IpAddress==INADDR\u NONE){
printf(“记录数据中的IP地址无效”);
用法(argv[0]);
}
打破
}
否则{
pmyDnsRecord->wDataLength=sizeof(DNS_PTR_DATA);//CNAME记录的数据结构
pNameData=argv[++i];
pmyDnsRecord->Data.Cname.pNameHost=pNameData;
打破
}
案例s:
//为IP4_阵列结构分配内存
pSrvList=(PIP4_数组)LocalAlloc(LPTR,sizeof(IP4_数组));
如果(!pSrvList){
printf(“内存分配失败\n”);
出口(1);
}
if(argv[++i]){
strncpy(DnsServIp,argv[i],sizeof(DnsServIp)-1;
DnsServIp[sizeof(DnsServIp)-1]='\0';
pSrvList->AddrCount=1;
pSrvList->AddrArray[0]=inet_addr(DnsServIp);//DNS服务器IP地址
if(pSrvList->AddrArray[0]==INADDR\u NONE){
printf(“无效的DNS服务器IP地址\n”);
用法(argv[0]);
}
打破
}
违约:
用法(argv[0]);
打破
}
}
其他的
用法(argv[0]);
}
}否则{
用法(argv[0]);
}
//调用函数DNSModifyRecordsInSet_A以添加主机或CNAME记录
status=DnsModifyRecordsInSet_A(pmyDnsRecord,//指向DNS_记录的指针
无效的
DNS\u更新\u安全性\u使用\u默认值,//不要尝试安全的动态更新
NULL,//使用默认凭据
pSrvList,//包含DNS服务器IP地址
NULL);//保留供将来使用