入社して以来、人月なんぼで売られている身なので、
包丁い〜っぽん♪ならずノートパソコン一冊であちこちを渡り歩かねばなりません。
そこで必要になってくるのが、
自宅 ・ 自社1 ・ 自社2 ・ お客様先 ・ AirH" ・ AirH"+VPN ・・・
と必要に応じてネットワークの設定を切り替えることができるツールです。
ワンクリックで、以下の設定ががっと変わってくれたらうれしいな・・・
私の使っているThink Pad X31には、Access Connectionsというソフトが付属していて
上記の要件の内、大抵のことをやってくれます。
しかし、惜しいことにNetBIOS周りの設定(ドメイン・ワークグループ)は変更してくれません。
| 変更項目 | IP | DNS | Domain | Proxy | 無線LAN | AirH" | VPN | 切替え時に任意のバッチを起動 |
| Access Connections | o | o | x | o | o | o | o | o |
| ValhelIPConfig | o | o | o | o | x | x | x | o |
| ChangeProxy+Dial | x | x | x | o | x | o | x | x |
Access Connectionsは、ネットワーク設定切替え時にバッチファイルを動かすことができます。
そこで、ドメイン名を変えるアプリをさくっと作って、Access Connectionsの
ロケーションプロファイルに登録してやれば満足できる環境が手に入れられます。
| 変更項目 | IP | DNS | Domain | Proxy | 無線LAN | AirH" | VPN | 切替え時バッチ |
| Access Connections | o | o | x | o | o | o | o | Domain変更アプリ |
ぐぐってみたところ、
どうやらWin32APIのNetJoinDomainを叩けばいいらしい。
引数でドメイン名やワークグループ名を与えるとして、
[Usage1] changeDomain.exe WorkGroupName [Usage2] changeDomain.exe DomainName Account Password
という仕様のコンソールプログラムをざざっと書くと以下のようになりました。
/**
* changeDomain.cpp
*/
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <lm.h>
#include <lmjoin.h>
#define BUFSIZE 256
#define ARG_DOMAIN 1 // 第一引数はドメイン名 or ワークグループ名
#define ARG_ACCOUNT 2 // 第二引数はユーザ名(ドメイン変更時のみ必要)
#define ARG_PASSWD 3 // 第三引数はパスワード(ドメイン変更時のみ必要)
#define JOIN_WG NETSETUP_JOIN_UNSECURE
#define JOIN_DOMAIN NETSETUP_JOIN_DOMAIN+NETSETUP_ACCT_CREATE+NETSETUP_DOMAIN_JOIN_IF_JOINED
int main( int argc , char** argv ){
/* 引数の列挙 */
for( int cnt = 1 ; cnt < argc ; cnt++ ){
printf( "arg%d : %s\n" , cnt , argv[cnt] );
}
/* ワークグループ名・ドメイン名を変更する */
NET_API_STATUS ret; // NetJoinDomainの返値を格納する
switch( argc ){
case 2:
/* ワークグループを変更する場合 */
WCHAR workGroup[BUFSIZE];
MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,argv[ARG_DOMAIN],-1,workGroup,sizeof(workGroup));
ret = NetJoinDomain( NULL , workGroup , NULL , NULL , NULL , JOIN_WG );
break;
case 4:
/* ドメインを変更する場合 */
WCHAR domain[BUFSIZE];
WCHAR account[BUFSIZE];
WCHAR passwd[BUFSIZE];
MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,argv[ARG_DOMAIN] ,-1,domain ,sizeof(domain));
MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,argv[ARG_ACCOUNT],-1,account,sizeof(account));
MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,argv[ARG_PASSWD] ,-1,passwd ,sizeof(passwd));
ret = NetJoinDomain( NULL , domain , NULL , account , passwd , JOIN_DOMAIN );
break;
default:
/* 引数の数がおかしいとき */
printf( "Error : invalid Argument\n" );
return -1;
}
/* エラー処理 */
switch( ret ){
case ERROR_INVALID_PARAMETER:
printf( "Error : Invalid Parameters.\n" );
return -1;
case ERROR_NO_SUCH_DOMAIN:
printf( "Error : No such domain.\n" );
return -1;
case NERR_SetupAlreadyJoined:
printf( "Error : This computer is already joined to the domain.\n" );
return -1;
case NERR_InvalidWorkgroupName:
printf( "Error : Workgroup Name is invalid.\n" );
return -1;
}
/* 正常終了 */
printf( "succeeded\n" );
return 0;
}
コンパイルは、bcc32で行いました。
>bcc32 changeDomain.cpp >dir 2004/05/11 23:07 2,009 changeDomain.cpp 2004/05/11 23:08 53,248 changeDomain.exe 2004/05/11 23:08 5,370 changeDomain.obj 2004/05/11 23:08 393,216 changeDomain.tds
動くかどうかテストしてみます
>changeDomain.exe WindowSide arg1 : WindowSide succeeded
ちゃんとワークグループ名は変わったようです。
長いワークグループ名を与えてみてエラーが起きるかどうかを確かめてみます。
>changeDomain.exe WindowSideWorkGroup arg1 : WindowSideWorkGroup Error : Workgroup Name is invalid.
どうやらちゃんとエラーを拾えているようです。
後日自社で試したところ、ドメインへの参加もできました*1。
ただしドメインのセキュリティポリシーをガシガシ適用されちゃうので、特に
プリンタを使えない、
共有サーバを使えない
ということがなければ、
素直にWorkGroupワークグループ?に参加した方が良かったかも・・・
ロケーション毎に、
#HOME.bat .\changeDomain.exe HOMELAN > changeDomain.log
などとバッチファイルを作成して、
Access Connectionsに登録します。
changeDomain.exe本体とAccess Connectionsから呼ぶためのバッチファイルです。
よろしかったらお使いください。(NortonAntiVirus2004-定義ファイル2004/05/09で検疫済み)