Win32 API 日本語リファレンス
ホームSecurity.Authentication.Identity › ICcgDomainAuthCredentials

ICcgDomainAuthCredentials

COM
IID6ecda518-2010-4437-8bc3-46e752b7b172継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

ドメインに参加していないコンテナーを Active Directory で認証するために、開発者が実行時に独自の資格情報を動的に提供できるようにする、クライアント実装のインターフェイスです。

メソッド 1

vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。

vtbl 3 HRESULT GetPasswordCredentials(LPWSTR pluginInput, LPWSTR* domainName, LPWSTR* username, LPWSTR* password)

ドメインに参加していないコンテナーを Active Directory で認証するための資格情報を返します。

pluginInputLPWSTRinコンテナー ランタイムから渡される入力文字列です。クライアント側の実装では、指定された入力文字列を使用して、通常はセキュアなストレージ プロバイダーから認証資格情報を取得し、それを出力パラメーターとして返します。この入力文字列は、資格情報仕様ファイル (credential specification file) を通じて Host Compute Services (HCS) に提供されます。詳細については、Remarks セクションを参照してください。
domainNameLPWSTR*out資格情報のドメイン名です。
usernameLPWSTR*out資格情報のユーザー名です。
passwordLPWSTR*out資格情報のパスワードです。

戻り値

戻り値は HRESULT です。値が S_OK の場合、呼び出しが成功したことを示します。

解説(Remarks)

この API は同時に呼び出される可能性があります。そのため、開発者は実装がスレッド セーフであることを保証する必要があります。また、この COM オブジェクトはプロセス外 (out-of-proc) でアクティブ化されるため、適切に登録する必要があります。

実装者は、自身の COM CLSID 用のキーを “HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CCG\COMClasses” の下に追加する必要があります。“CCG\COMClasses” への書き込みアクセスは、SYSTEM アカウントと Administrator アカウントに制限されています。

以下は資格情報仕様ファイルの例です。このファイルを Docker に渡す方法については、gMSA を使用したコンテナーの実行を参照してください。

{
    "CmsPlugins": [
        "ActiveDirectory"
    ],
    "DomainJoinConfig": {
        "Sid": "S-1-5-21-3700119848-2853083131-2094573802",
        "MachineAccountName": "gmsa1",
        "Guid": "630a7dd3-2d3e-4471-ae91-1d9ea2556cd5",
        "DnsTreeName": "contoso.com",
        "DnsName": "contoso.com",
        "NetBiosName": "CONTOSO"
    },
    "ActiveDirectoryConfig": {
        "GroupManagedServiceAccounts": [
            {
                "Name": "gmsa1",
                "Scope": "contoso.com"
            },
            {
                "Name": "gmsa1",
                "Scope": "CONTOSO"
            }
        ],
        "HostAccountConfig": {
            "PortableCcgVersion": "1",
            "PluginGUID": "{CFCA0441-511D-4B2A-862E-20348A78760B}",
            "PluginInput": "contoso.com:gmsaccg:<password>"
        }
    }
}

次の例は、ICcgDomainAuthCredentials の簡単な実装を示しています。説明を分かりやすくするため、このサンプルでは入力文字列を単に解析することで資格情報を取得しています。実際の実装では、資格情報をセキュアなデータ ストアに保存し、入力文字列を使用してその資格情報の場所を特定します。また、簡潔にするため、標準的な COM メソッドの実装はこのサンプルから省略しています。

// UUID generated by the developer
[uuid("cfca0441-511d-4b2a-862e-20348a78760b")] 
class CCGStubPlugin : public RuntimeClass<RuntimeClassFlags<RuntimeClassType::ClassicCom>, ICcgDomainAuthCredentials >
{
   public:
    CCGStubPlugin() {}

    ~CCGStubPlugin() {}

    IFACEMETHODIMP GetPasswordCredentials(
        _In_ LPCWSTR pluginInput,
        _Outptr_ LPWSTR *domainName,
        _Outptr_ LPWSTR *username,
        _Outptr_ LPWSTR *password)
    {
        std::wstring domainParsed, userParsed, passwordParsed; 
        try
        {
            if(domainName == NULL || username == NULL || password == NULL)
            {
                return STG_E_INVALIDPARAMETER;
            }
            *domainName = NULL;
            *username = NULL;
            *password = NULL;
            wstring pluginInputString(pluginInput);
            if (count(pluginInputString.begin(), pluginInputString.end(), ':') < 2)
            {
                return CO_E_NOT_SUPPORTED;
            }
            // Extract creds of this format Domain:Username:Password
            size_t sep1 = pluginInputString.find(L":");
            size_t sep2 = pluginInputString.find(L":", sep1 + 1);
            domainParsed = pluginInputString.substr(0, sep1);
            userParsed = pluginInputString.substr(sep1 + 1, sep2 - sep1 - 1);
            passwordParsed = pluginInputString.substr(sep2 + 1);
        }
        catch (...)
        {
            return EVENT_E_INTERNALERROR;
        }

        auto userCo = wil::make_cotaskmem_string_nothrow(userParsed.c_str());
        auto passwordCo = wil::make_cotaskmem_string_nothrow(passwordParsed.c_str());
        auto domainCo = wil::make_cotaskmem_string_nothrow(domainParsed.c_str());
        if (userCo == nullptr || passwordCo == nullptr || domainCo == nullptr)
        {
            return STG_E_INSUFFICIENTMEMORY;
        }

        *domainName = domainCo.release();
        *username = userCo.release();
        *password = passwordCo.release();
        return S_OK;
    }
};
CoCreatableClass(CCGStubPlugin);
出典・ライセンス: 上記「公式ドキュメント」の内容は 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_ICcgDomainAuthCredentials "{6ECDA518-2010-4437-8BC3-46E752B7B172}"
#usecom global ICcgDomainAuthCredentials IID_ICcgDomainAuthCredentials "{}"
#comfunc global ICcgDomainAuthCredentials_GetPasswordCredentials  3 wstr,var,var,var
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。