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() すればよいはずです(試してない)

Trackback

no comment untill now

Add your comment now