8月
19
DNS ホスト名から NetBIOS コンピュータ名を取得することを考えます。
まず、そのものズバリの名前を持つ API である DnsHostnameToComputerName() というのが見つかりました。おーできてるできてる…と思って “localhos” (localhost ではない)とか渡すと “LOCALHOS” が返ってきます。よく説明を読むと “This function performs a textual mapping of the name.” などと書いてあって、何の役にも立たないことが分かります。
で、いろいろ迷走しつつ、数時間かけて NetWkstaGetInfo() にたどり着きました。wksta は workstation の略ですが、変な省略はやめてほしいものです。最初 wktk かと思いました。
#include <stdio.h>
#include <windows.h>
#include <lm.h>
#pragma comment(lib, "netapi32.lib")
int wmain(int argc, wchar_t **argv)
{
WKSTA_INFO_100 *wki = NULL;
NET_API_STATUS st;
if ((st = NetWkstaGetInfo(argv[1], 100, (LPBYTE *)&wki)) != NERR_Success)
{
wprintf(L"error %d\n", st);
return 1;
}
wprintf(L"%s\n", wki->wki100_computername);
return 0;
}
C:\Users\umezawa\Documents>NetWkstaGetInfo nyx.local NYX C:\Users\umezawa\Documents>NetWkstaGetInfo nyx NYX C:\Users\umezawa\Documents>NetWkstaGetInfo somealias.local NYX C:\Users\umezawa\Documents>NetWkstaGetInfo nonexistent.local error 53
ちなみに似た名前で NetServerGetInfo() というのがありますが、こっちは引数に渡したサーバ名がそのまま返ってくるようです。なんでやねん。
なお、逆、つまり「DNS ホスト名か NetBIOS コンピュータ名か分からないものが与えられたときに、その DNS ホスト名を取得する」は、gethostbyname() してから getnameinfo() すればよいはずです(試してない)
no comment untill now