- PR -

VB.NETを利用したグループの作成(ドメイン使用)について

1
投稿者投稿内容
libble
会議室デビュー日: 2004/10/16
投稿数: 11
お住まい・勤務地: 新横浜
投稿日時: 2006-07-20 14:59
こんにちは。

ADSI経由でActiveDirectoryに新規グループを作成したいと考えています。

MSのActiveDirectorySDK2.5のヘルプ、MSDNライブラリを参照し、以下の
ようなコードを次の環境にて実行したところ、エラーとなりグループ作成が
できません。
 ただし、一部のプロパティ設定を行わない場合、作成できます。
当該プロパティはグループ作成時には指定できないのでしょうか?
教えてください。(グループ作成は一応できるが、すっきりしません・・)


環境:
プログラム実行環境 :WindowsXPsp2+vb.net2003 (ドメインのAdmin権限の
           あるユーザで実行)
ドメインコントローラ:Windows2000serverでネイティブモード
(初期にWin2Kで構築し、その後Win2003をバックアップDCとして追加)

----------------------------------------------------
Sub test()
Dim cont As IADsContainer
cont = GetObject("LDAP://Domain1.co.jp/CN=Users,DC=Domain1,DC=co,DC=jp")
CreateSimpleGroup(cont,"test","test", _
ADS_GROUP_TYPE_GLOBAL_GROUP Or ADS_GROUP_TYPE_SECURITY_ENABLED)
End sub
Sub CreateSimpleGroup(ByVal oDirObject As IDirectoryObject, _
ByVal sCommonName As String, _
ByVal sSAMAcctName As String, _
ByVal iGroupType As Long)
Dim oNewObject As IADs
Dim oIadsContDirObj As IADsContainer

oIadsContDirObj = oDirObject
oNewObject = oIadsContDirObj.Create("group", "CN=" & sCommonName)
oNewObject.Put("sAMAccountName", sSAMAcctName)
oNewObject.Put("GroupType", iGroupType)  ←※ここでエラー発生
oNewObject.SetInfo()
oNewObject = Nothing
oIadsContDirObj = Nothing
end sub
----------------------------------------------------

※の箇所で、下記のエラーが表示されます。
「'System.Runtime.InteropServices.COMException' の
 ハンドルされていない例外が発生しました。追加情報:
 エラーを特定できません」

WSH でグループ登録を行うサンプルをネットから拾い、実行すると
登録ができます。違いは、※部分のGroupTypeを設定する箇所です。
※部分をコメントアウトし、実行すると登録でき、そのグループの
grouptype は一応、現在こちらが望む値になっています。。。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-07-20 15:17
引用:

libbleさんの書き込み (2006-07-20 14:59) より:

oNewObject.Put("GroupType", iGroupType)  ←※ここでエラー発生

※の箇所で、下記のエラーが表示されます。
「'System.Runtime.InteropServices.COMException' のハンドルされていない例外が発生しました。
追加情報:エラーを特定できません」


HRESULT からの例外ではないのですね。(微妙ですね)

第 2 引数のプリフィクスが 'i' のわりには、型が 'Long' になっていますね。
Long (System.Int64) ではなく、Integer (System.Int32) でマッピングしてみてください。

コード:

    oNewObject.Put("groupType", ADS_GROUP_TYPE_GLOBAL_GROUP Or ADS_GROUP_TYPE_SECURITY_ENABLED)


ADS_GROUP_TYPE_GLOBAL_GROUP と ADS_GROUP_TYPE_SECURITY_ENABLED は、
いずれも System.Int32 とする。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
libble
会議室デビュー日: 2004/10/16
投稿数: 11
お住まい・勤務地: 新横浜
投稿日時: 2006-07-20 15:33
じゃんぬねっとさん、ありがとうございます。

ご指摘のとおり、Long型ではなく、Integer型に変更したところ、無事問題の箇所
(GrouptTypeプロパティの設定)は動作しました!!

まったくお恥ずかしいかぎりです...

自分はVB6 での開発経験はあるのですが、今回ActiveDirectoryをイジるにあたり、
vb.netの方がWin32APIとか使わなくても組めそう、ということで、初めてvb.netを
利用しました。
 へプル(MSDN)サンプルコードをコピペして、とりあえず動かしていたため、
よく理解せずにあたふたしてました・・。

おかげさまで、目的の処理が実装できます。ありがとうございました。


[ メッセージ編集済み 編集者: libble 編集日時 2006-07-20 15:34 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-07-20 16:19
引用:

libbleさんの書き込み (2006-07-20 15:33) より:

ご指摘のとおり、Long型ではなく、Integer型に変更したところ、無事問題の箇所
(GrouptTypeプロパティの設定)は動作しました!!


お役に立てたようで、良かったです。

引用:

自分はVB6 での開発経験はあるのですが、今回ActiveDirectoryをイジるにあたり、vb.netの方がWin32APIとか使わなくても組めそう、ということで、初めてvb.netを利用しました。


仕様によっては、結局、Windows API を使わなければならなくなることもあります。

また、今回のように、COM を利用する場合は、むしろ VB6 以前の方が相性が良いと思います。
このユニットだけ、VB6 で作成していても良かったかもしれませんね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ちゃっぴ
ぬし
会議室デビュー日: 2004/12/10
投稿数: 873
投稿日時: 2006-07-21 07:13
.Net Framework には System.DirectoryService.DirectoryEntry という ActiveDS COM wrapper class があるんですがね。。。
libble
会議室デビュー日: 2004/10/16
投稿数: 11
お住まい・勤務地: 新横浜
投稿日時: 2006-07-21 10:03
引用:

ちゃっぴさんの書き込み (2006-07-21 07:13) より:
.Net Framework には System.DirectoryService.DirectoryEntry という ActiveDS COM wrapper class があるんですがね。。。



ご指摘ありがとうございます。
なにぶん、vb.netを初めて利用しているため、サンプルをネットで探して
とりあえずADSIで出来るようだ、という取っ掛りで行っているため、十分に
vb.netの機能を利用できていないです...

ご指摘のclass について、試してみます。。

1

スキルアップ/キャリアアップ(JOB@IT)