Web/DB プログラミング徹底解説

ホーム > Windows 徹底解説 > ドメインコントローラ名の取得コマンド

ドメインコントローラ名の取得コマンド

ドメインコントローラのホスト名を取得する必要が出てきました。

コマンドがわからなかったので、ググってみると、いまひとつ良いコマンドが出てきません。

中には、

> echo %LOGONSERVER%

等を使え、と書いてある記事も見つけましたが、LOGONSERVER という環境変数はドキュメントされていない環境変数なので、 これは使う気になれません。

さらに調べると XP の環境でも、Support Tools の netdom.exe を使うことで、ドメインコントローラ名を取れるようなのですが、 残念ながらすぐに Support Tools を用意できません。

ちょと困ったなぁ、と思ったのですが

「いやまてよ。netdom.exe みたいなコマンドがあるなら、きっと便利な API があるはずだ」

と思い直し MSDN を見ると、案の定、ありました。

DsGetDcName にマシン名やドメイン名を渡すと、ドメインコントローラの情報を返すとのことです。

そこで、さっそく DsGetDcName を使ってドメインコントローラの情報を取得するコマンドを書きました。

ダウンロード

下記のコードをビルドしただけの単純なものですが、良かったら使ってください。

» FindDC コマンド ダウンロード

コード

ポイントは 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 として作成しています。