スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

--.--.-- | スポンサー広告

ADSI プログラム

各プログラミング言語にはそれぞれ固有の利点があると思う。

VB ならダイアログベースプログラムに
C++ ならテイストやバイナリを扱う簡単なプログラム&実用性の高いアプリの開発に
C# や Java は Web 系のアプリの開発(Java なら携帯アプリもありますね)に向いていると思う。
(ぶっちゃけ ダイアログベースの簡単なアプリを作るのに C++ なんか使わないし
 ActiveDirectory を触るのなら WSH で十分だと思う)

そういう意味で VB がオブジェクト指向よりになったとき、
「なぜにゆえ?」と本気で思った。
(どうせならもっと GUI 開発に特化してほしかった・・・・・・)

……なんか最近どの言語も付け足しで機能を増やしていって
どれも似たり寄ったりの様相を呈しているような気がする。

個人的にはもっと上流……
GUI レベルのプログラムが楽にできる言語または仕組みが
あるといいなあ~と思ってるんだが
(たとえば現時点だと独自のコントロールを作成しようと思うと
 かなりの手間が必要なってしまう)



さて今回は ADSI を使ったプログラムとなります。
(WSH版とC++版を用意しました)

実行すると指定した PC にユーザを作成します。
(当然コンピュータ名は任意に変更してください)

C++版

#include <windows.h>
#include <stdio.h>
#include <locale.h>
#include <activeds.h>
#include <Iads.h>
#include <Adshlp.h>
#include <tchar.h>
#include <comutil.h>

int wmain(int argc, wchar_t* argv[])
{
IADsContainer *container = NULL;
IDispatch *dispatch_user = NULL;
IADsUser *new_user = NULL;
IADsGroup *user_group = NULL;
HRESULT hr;
_bstr_t path = L"WinNT://";
_bstr_t computer_name = L"(任意)"; // コンピュータ名
_bstr_t user_name = L"Test"; // 作成するユーザ名
_bstr_t password = L"password"; // パスワード

setlocale(LC_ALL, "Japanese");
::CoInitialize(NULL);

hr = ::ADsGetObject(path + computer_name + L",Computer", IID_IADsContainer,
reinterpret_cast<void**>(&container));
if(FAILED(hr)){
wprintf(L"ADS オブジェクトの作成に失敗しました");
goto ADSI_ERROR;
}

hr = container->Create(L"User", user_name, &dispatch_user);
if(FAILED(hr)){
wprintf(L"ユーザの作成に失敗しました");
goto ADSI_ERROR;
}

hr = dispatch_user->QueryInterface(IID_IADsUser,
reinterpret_cast<void**>(&new_user));
if(FAILED(hr)){
wprintf(L"オブジェクトの変換に失敗しました");
goto ADSI_ERROR;
}

new_user->SetPassword(password);
new_user->Put(L"PasswordExpired", _variant_t(static_cast<long>(0)));
new_user->Put(L"UserFlags",
_variant_t(static_cast<long>(ADS_UF_DONT_EXPIRE_PASSWD |
ADS_UF_PASSWD_CANT_CHANGE)));
new_user->put_Description(L"このアカウントはテスト用です");
new_user->SetInfo();

hr = ::ADsGetObject(path + computer_name + L"/Users", IID_IADsGroup,
reinterpret_cast<void**>(&user_group));
if(FAILED(hr)){
wprintf(L"ADS オブジェクトの作成に失敗しました");
goto ADSI_ERROR;
}
user_group->Add(path + computer_name + L"/" + user_name);
user_group->SetInfo();

ADSI_ERROR:
if(user_group != NULL) user_group->Release();
if(container != NULL) new_user->Release();
if(dispatch_user != NULL) dispatch_user->Release();
if(container != NULL) container->Release();
CoUninitialize();

return 0;
}



WSH版

const ADS_UF_PASSWD_CANT_CHANGE = &H40
const ADS_UF_DONT_EXPIRE_PASSWD = &H10000

strPath = "WinNT://"
strComputer = "(任意)"
strUser = "TEST"
strPassword = "password"

set MyContainer = GetObject(strPath & strComputer & ",Computer")
set NewUser = MyContainer.Create("User", strUser)
NewUser.SetPassword strPassword
NewUser.Put "PasswordExpired", 0
newFlags = ADS_UF_DONT_EXPIRE_PASSWD or ADS_UF_PASSWD_CANT_CHANGE
NewUser.Put "UserFlags", newFlags
NewUser.Description = "このアカウントはテスト用です"
NewUser.SetInfo

set AddGroup = GetObject(strPath & strComputer & "/Users")
AddGroup.Add strPath & strComputer & "/" & strUser
AddGroup.SetInfo




・・・・・・本当は WSH だとこんなに簡単にかけます! というつもりだったのだが・・・・・・

ほとんどかわらねえーーー('A`)

これなら WMI のほうがよほど参考例になるかorz
スポンサーサイト

テーマ:プログラミング - ジャンル:コンピュータ

2006.12.15 | Comments(0) | Trackback(0) | プログラム

コメント

コメントの投稿


秘密にする

«  | HOME |  »

ブロとも申請フォーム

この人とブロともになる

カウンター


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。