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