ドメインコントローラ名の取得コマンド
ドメインコントローラのホスト名を取得する必要が出てきました。
コマンドがわからなかったので、ググってみると、いまひとつ良いコマンドが出てきません。
中には、
> echo %LOGONSERVER%
等を使え、と書いてある記事も見つけましたが、LOGONSERVER という環境変数はドキュメントされていない環境変数なので、 これは使う気になれません。
さらに調べると XP の環境でも、Support Tools の netdom.exe を使うことで、ドメインコントローラ名を取れるようなのですが、 残念ながらすぐに Support Tools を用意できません。
ちょと困ったなぁ、と思ったのですが
「いやまてよ。netdom.exe みたいなコマンドがあるなら、きっと便利な API があるはずだ」
と思い直し MSDN を見ると、案の定、ありました。
DsGetDcName にマシン名やドメイン名を渡すと、ドメインコントローラの情報を返すとのことです。
そこで、さっそく DsGetDcName を使ってドメインコントローラの情報を取得するコマンドを書きました。
ダウンロード
下記のコードをビルドしただけの単純なものですが、良かったら使ってください。
コード
ポイントは DsGetDcName を呼び出すところです。
#include "displayerr.h" #include <Dsgetdc.h> #include <Lm.h> #include <stdio.h> ///////////////////////////////////////////////////////////////////////////// VOID PrintDCInfo( PDOMAIN_CONTROLLER_INFO pDci ) { if ( NULL == pDci ) { return; } printf( "Domain Controller Name: %s\n", pDci->DomainControllerName ); printf( "Domain Controller Address: %s\n", pDci->DomainControllerAddress ); printf( "Domain Name: %s\n", pDci->DomainName ); printf( "DNS Forest Name: %s\n", pDci->DnsForestName ); printf( "DC Site Name: %s\n", pDci->DcSiteName ); printf( "Client Site Name: %s\n", pDci->ClientSiteName ); } ///////////////////////////////////////////////////////////////////////////// VOID PrintUsage() { printf( "Keisuke Oyama (C) System Utility - FindDC Command\n" ); printf( "http://keicode.com/\n" ); printf( "\n" ); printf( "Usage:\n" ); printf( " > finddc MACHINENAME\n" ); printf( "\n" ); } ///////////////////////////////////////////////////////////////////////////// int main ( int argc, char* argv[] ) { if ( argc != 2 ) { PrintUsage(); return 1; } DWORD dwRet; PDOMAIN_CONTROLLER_INFO pDci = NULL; dwRet = DsGetDcName( argv[1], NULL, NULL, NULL, DS_PDC_REQUIRED, &pDci ); if ( ERROR_SUCCESS == dwRet ) { PrintDCInfo( pDci ); NetApiBufferFree( pDci ); pDci = NULL; } else { printf( "ERROR %u - ", dwRet ); DisplayError( dwRet ); printf( "\n" ); } return 0; }
makefile は次の通りです。
TARGETNAME=finddc OUTDIR=.\chk LINK32=link.exe ALL : "$(OUTDIR)\$(TARGETNAME).exe" CPPFLAGS=\ /nologo\ /MT\ /W4\ /Fo"$(OUTDIR)\\"\ /Fd"$(OUTDIR)\\"\ /c\ /Zi\ /D_WIN32_WINNT=0x0501 LINK32_FLAGS=\ Netapi32.lib\ /nologo\ /subsystem:console\ /pdb:"$(OUTDIR)\$(TARGETNAME).pdb"\ /out:"$(OUTDIR)\$(TARGETNAME).exe"\ /DEBUG\ /RELEASE LINK32_OBJS= \ "$(OUTDIR)\$(TARGETNAME).obj"\ "$(OUTDIR)\displayerr.obj" "$(OUTDIR)\$(TARGETNAME).exe" : "$(OUTDIR)" $(LINK32_OBJS) $(LINK32) $(LINK32_FLAGS) $(LINK32_OBJS) "$(OUTDIR)" : if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" .c{$(OUTDIR)}.obj: $(CPP) $(CPPFLAGS) $< .cpp{$(OUTDIR)}.obj: $(CPP) $(CPPFLAGS) $<
尚、DisplayError 関数はマイクロソフトのサポート技術情報や SID ルックアップツール などのコードを参考にしてください。
DisplayError 関数の実装を displayerr.cpp に、そのヘッダファイルを displayerr.h として作成しています。