Win32 API 日本語リファレンス
ホームNetworking.ActiveDirectory › IADsGroup

IADsGroup

COMIDispatch (デュアル)
IDispatch を実装(デュアルインターフェース)。HSP では comobj 経由でメソッド名による遅延バインド呼び出しができます(vtableインデックス不要)。
IID27636b00-410f-11cf-b1ff-02608c9e7553継承元IADs呼び出し名前(IDispatch) または vtbl自前メソッド開始 vtbl20

公式ドキュメント

ディレクトリサービス内のグループメンバーシップデータを管理します。

メソッド 6

vtbl = vtable インデックス(0始まり)。IDispatch 実装のため HSP ではメソッド名でも呼べます(上記)。低レベルの index 呼び出し用に vtbl も掲載。0〜2 は IUnknown。

vtbl 20 HRESULT get_Description(LPWSTR* retval)
retvalLPWSTR*outグループの説明文字列を受け取る出力先。BSTRで返る。
vtbl 21 HRESULT put_Description(LPWSTR bstrDescription)
bstrDescriptionLPWSTRin設定するグループの説明文字列をBSTRで指定する。
vtbl 22 HRESULT Members(IADsMembers** ppMembers)

グループの直接のメンバーのコレクションを取得します。

ppMembersIADsMembers**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;
}
vtbl 23 HRESULT IsMember(LPWSTR bstrMember, VARIANT_BOOL* bMember)

ディレクトリサービスオブジェクトがグループの直接のメンバーであるかどうかを判定します。

bstrMemberLPWSTRinメンバーシップを検証するディレクトリサービスオブジェクトの ADsPath を格納します。この ADsPath は、グループへのバインドに使用したものと同じ ADSI プロバイダーを使用する必要があります。たとえば、グループへのバインドに LDAP プロバイダーを使用した場合、この ADsPath でも LDAP プロバイダーを使用する必要があります。
bMemberVARIANT_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;
vtbl 24 HRESULT Add(LPWSTR bstrNewItem)

既存のグループに ADSI オブジェクトを追加します。

bstrNewItemLPWSTRinグループに追加するオブジェクトの 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;
vtbl 25 HRESULT Remove(LPWSTR bstrItemToBeRemoved)

IADsGroup::Remove メソッドは、指定されたユーザーオブジェクトをこのグループから削除します。この操作は、グループにメンバーが残っていない場合でも、グループオブジェクト自体は削除しません。

bstrItemToBeRemovedLPWSTRinグループから削除するオブジェクトの 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 の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
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 不要)。