IADsGroup
COMIDispatch (デュアル)comobj 経由でメソッド名による遅延バインド呼び出しができます(vtableインデックス不要)。公式ドキュメント
ディレクトリサービス内のグループメンバーシップデータを管理します。
メソッド 6
vtbl = vtable インデックス(0始まり)。IDispatch 実装のため HSP ではメソッド名でも呼べます(上記)。低レベルの index 呼び出し用に vtbl も掲載。0〜2 は IUnknown。
| retval | LPWSTR* | out | グループの説明文字列を受け取る出力先。BSTRで返る。 |
| bstrDescription | LPWSTR | in | 設定するグループの説明文字列をBSTRで指定する。 |
グループの直接のメンバーのコレクションを取得します。
| ppMembers | IADsMembers** | out | グループメンバーのコレクションを受け取る IADsMembers インターフェースポインターへのポインターです。呼び出し側は、このインターフェースが不要になったら解放する必要があります。 |
戻り値
このメソッドは S_OK を含む標準の戻り値をサポートします。詳細およびその他の戻り値については、ADSI Error Codes を参照してください。
解説(Remarks)
IADsMembersMembers メソッドは同じプロバイダーを使用します。
例
次のコード例は、グループのすべてのメンバーを列挙します。
Dim grp As IADsGroup
Dim memberList As IADsMembers
Dim member As IADs
On Error GoTo Cleanup
Set grp = GetObject("WinNT://Microsoft/Administrators")
Set memberList = grp.Members
For Each m In memberList
Set member = m
Debug.Print member.Name & "(" & member.Class & ")"
Next
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set grp = Nothing
Set member = Nothing
Set memberList = Nothing
次のコード例は、グループのすべてのメンバーを列挙します。
HRESULT EnumerateGroupMembers(IADsGroup *pGroup)
{
IADsMembers *pMembers;
HRESULT hr = S_OK;
hr = pGroup->Members(&pMembers);
if(FAILED(hr)){goto Cleanup;}
hr = EnumMembers(pMembers); // For more information and a code
example, see IADsMembers::get__NewEnum.
if(FAILED(hr)){goto Cleanup;}
Cleanup:
if(pMembers)
pMembers->Release();
return hr;
}
ディレクトリサービスオブジェクトがグループの直接のメンバーであるかどうかを判定します。
| bstrMember | LPWSTR | in | メンバーシップを検証するディレクトリサービスオブジェクトの ADsPath を格納します。この ADsPath は、グループへのバインドに使用したものと同じ ADSI プロバイダーを使用する必要があります。たとえば、グループへのバインドに LDAP プロバイダーを使用した場合、この ADsPath でも LDAP プロバイダーを使用する必要があります。 |
| bMember | VARIANT_BOOL* | out | オブジェクトがグループの直接のメンバーである場合は VARIANT_TRUE を、それ以外の場合は VARIANT_FALSE を受け取る VARIANT_BOOL 値へのポインターです。 |
戻り値
このメソッドは S_OK を含む標準の戻り値をサポートします。詳細については、ADSI Error Codes を参照してください。
解説(Remarks)
WinNT プロバイダーを介してメンバーの SID を使用してセキュリティプリンシパルをグループに追加または削除することはできますが、IADsGroup.IsMember メソッドは、WinNT プロバイダーを介してメンバーがグループに属しているかどうかを検証するために SID の ADsPath を使用することをサポートしていません。
IADsGroup::IsMember メソッドは、グループとオブジェクトが同じドメイン内にある場合にのみ正しく動作します。オブジェクトがグループとは異なるドメインにある場合、IADsGroup::IsMember は常に VARIANT_FALSE を返します。
例
次のコード例は、"Fabrikam" ドメインの "Administrators" グループに "jeffsmith" ユーザーを追加し、そのユーザーがグループのメンバーになったことを報告します。
Dim grp As IADsGroup
On Error GoTo Cleanup
Set grp = GetObject("WinNT://Microsoft/Administrators")
grp.Add ("WinNT://Fabrikam/jeffsmith")
Debug.Print grp.IsMember("WinNT://Fabrikam/jeffsmith ") ' Should be TRUE.
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set grp = Nothing
次のコード例は、ユーザーをグループに追加する前に、そのユーザーがグループに属しているかどうかを検証します。
IADsGroup *pGroup = NULL;
HRESULT hr = S_OK;
LPWSTR adsPath = L"WinNT://Fabrikam/Administrators";
BSTR bstr = NULL;
hr = ADsGetObject(adsPath, IID_IADsGroup, (void**)&pGroup);
if(FAILED(hr))
{
goto Cleanup;
}
hr = pGroup->get_Description(&bstr);
if(FAILED(hr))
{
goto Cleanup;
}
printf("Description: %S\n",bstr);
SysFreeString(bstr);
VARIANT_BOOL inG=false;
hr = pGroup->IsMember(CComBSTR("WinNT://Microsoft/SecUser"), &inG);
if (inG )
{
printf("already in the group.\n");
}
else
{
hr = pGroup->Add(CComBSTR("WinNT://Microsoft/SecUser"));
if(FAILED(hr))
{
goto Cleanup;
}
printf("user added.\n");
}
Cleanup:
if(pGroup)
{
pGroup->Release();
}
if(bstr)
{
SysFreeString(bstr);
}
return hr;
既存のグループに ADSI オブジェクトを追加します。
| bstrNewItem | LPWSTR | in | グループに追加するオブジェクトの ADsPath を指定する BSTR を格納します。詳細については、「解説」を参照してください。 |
戻り値
以下は最も一般的な戻り値です。戻り値の詳細については、ADSI Error Codes を参照してください。
解説(Remarks)
LDAP プロバイダーを使用して IADsGroup オブジェクトにバインドした場合、bstrNewItem パラメーターには同じ形式の ADsPath を指定する必要があります。たとえば、IADsGroup オブジェクトへのバインドに使用した ADsPath にサーバーが含まれている場合、bstrNewItem パラメーターの ADsPath にも同じサーバープレフィックスを含める必要があります。同様に、サーバーレスパスを使用して IADsGroup オブジェクトにバインドした場合、bstrNewItem パラメーターにもサーバーレスパスを含める必要があります。サーバープレフィックスを使用する場合、グループと新しいメンバーが異なるドメインに属していると、要求が誤ったドメインコントローラーに送信され、正しいドメインのドメインコントローラーに紹介されてそこで再試行されることがあるため、遅延が発生することがあります。GUID またはセキュリティ識別子 (SID) の ADsPath を使用してメンバーを追加または削除する場合は例外です。この場合、bstrNewItem には常にサーバーレスパスを使用する必要があります。
Active Directory 用の LDAP プロバイダーでは、メンバーの SID の文字列形式を使用してメンバーをグループに追加できます。bstrNewItem パラメーターには、次の形式の SID 文字列を含めることができます。
LDAP://SID=<010500000000000515000000c6bb507afbda8b7f43170a325b040000>
Active Directory における SID 文字列の詳細については、Binding to an Object Using a SID を参照してください。
Active Directory 用の WinNT プロバイダーでも、メンバーの SID の文字列形式を使用してメンバーをグループに追加できます。bstrNewItem パラメーターには、次の形式の SID 文字列を含めることができます。
WinNT://S-1-5-21-35135249072896"
例
次のコード例は、WinNT プロバイダーを使用して、"Fabrikam" ドメインのグループ ("Administrators") にユーザーオブジェクト ("jeff") を追加する方法を示します。
Dim grp As IADsGroup
Set grp = GetObject("WinNT://Fabrikam/Administrators")
grp.Add ("WinNT://Fabrikam/jeff")
次のコード例は、LDAP プロバイダーを使用してユーザーオブジェクトをグループに追加する方法を示します。
Dim grp As IADsGroup
On Error GoTo Cleanup
Set grp = GetObject("LDAP://CN=Administrators, CN=Users, DC=Fabrikam, DC=com")
grp.Add("LDAP://CN=Jeff Smith, OU=Sales,DC=Fabrikam,DC=com")
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set grp = Nothing
次のコード例は、既存のユーザーアカウントを Administrators グループに追加します。
IADsGroup *pGroup = NULL;
HRESULT hr = S_OK;
LPWSTR adsPath = L"WinNT://Fabrikam/Administrators";
hr = ADsGetObject(adsPath,IID_IADsGroup,(void**)&pGroup);
if(FAILED(hr)) {goto Cleanup;}
// This assumes that the "WinNT://Fabrikam/jeff" user account exists
// and does not already belong to the Administrators group.
hr = pGroup->Add(_bstr_t("WinNT://Fabrikam/jeff"));
if(FAILED(hr)){goto Cleanup;}
Cleanup:
if(pGroup)
pGroup->Release();
return hr;
IADsGroup::Remove メソッドは、指定されたユーザーオブジェクトをこのグループから削除します。この操作は、グループにメンバーが残っていない場合でも、グループオブジェクト自体は削除しません。
| bstrItemToBeRemoved | LPWSTR | in | グループから削除するオブジェクトの ADsPath を指定する BSTR を格納します。このパラメーターの詳細については、「解説」セクションを参照してください。 |
戻り値
以下は最も一般的な戻り値です。戻り値の詳細については、ADSI Error Codes を参照してください。
解説(Remarks)
LDAP プロバイダーを使用して IADsGroup オブジェクトにバインドした場合、bstrItemToBeRemoved パラメーターには同じ形式の ADsPath を指定する必要があります。たとえば、IADsGroup オブジェクトへのバインドに使用した ADsPath にサーバーが含まれている場合、bstrItemToBeRemoved パラメーターの ADsPath にも同じサーバープレフィックスを含める必要があります。同様に、サーバーレスパスを使用して IADsGroup オブジェクトにバインドした場合、bstrItemToBeRemoved パラメーターにもサーバーレスパスを含める必要があります。例外は、GUID または SID の ADsPath を使用してメンバーを追加または削除する場合です。この場合、bstrItemToBeRemoved には常にサーバーレスパスを使用する必要があります。
WinNT プロバイダーを介して、ADsPath に SID を使用してグループからセキュリティプリンシパルを削除できます。たとえば、ユーザー "Fabrikam\jeffsmith" の SID が S-1-5-21-35135249072896 であるとすると、次のステートメント:
Dim group As IADsGroup
group.Remove("WinNT://S-1-5-21-35135249072896")
は次と同等です:
Dim group As IADsGroup
group.Remove("WinNT://Fabrikam/jeffsmith")
WinNT プロバイダーを介して SID を使用してメンバーを削除する機能は、Windows 2000 および DSCLIENT パッケージの新機能です。
例
次のコード例は、グループからユーザーアカウントを削除します。
Dim grp As IADsGroup
On Error GoTo Cleanup
Set grp = GetObject("WinNT://Fabrikam/Administrators")
grp.Remove ("WinNT://Fabrikam/jeffsmith")
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set grp = Nothing
次のコード例は、グループからユーザーを削除します。
IADsGroup *pGroup = NULL;
HRESULT hr = S_OK;
LPWSTR usrPath = L"WinNT://Fabrikam/jeffsmith";
LPWSTR grpPath = L"WinNT://Fabrikam/Administrators";
hr = ADsGetObject(grpPath, IID_IADsGroup, (void**)&pGroup);
if(FAILED(hr)){goto Cleanup;}
hr = pGroup->Remove(CComBSTR(usrPath));
if(FAILED(hr)){goto Cleanup;}
Cleanup:
if(pGroup)
pGroup->Release();
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IADsGroup "{27636B00-410F-11CF-B1FF-02608C9E7553}" #usecom global IADsGroup IID_IADsGroup "{}" #comfunc global IADsGroup_get_Description 20 var #comfunc global IADsGroup_put_Description 21 wstr #comfunc global IADsGroup_Members 22 sptr #comfunc global IADsGroup_IsMember 23 wstr,var #comfunc global IADsGroup_Add 24 wstr #comfunc global IADsGroup_Remove 25 wstr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。 ; ※IDispatch 実装。HSP では comobj 経由でメソッド名による呼び出しも可能(vtbl 不要)。#define global IID_IADsGroup "{27636B00-410F-11CF-B1FF-02608C9E7553}" #usecom global IADsGroup IID_IADsGroup "{}" #comfunc global IADsGroup_get_Description 20 sptr #comfunc global IADsGroup_put_Description 21 wstr #comfunc global IADsGroup_Members 22 sptr #comfunc global IADsGroup_IsMember 23 wstr,sptr #comfunc global IADsGroup_Add 24 wstr #comfunc global IADsGroup_Remove 25 wstr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。 ; ※IDispatch 実装。HSP では comobj 経由でメソッド名による呼び出しも可能(vtbl 不要)。