ICcgDomainAuthCredentials::GetPasswordCredentials メソッド (ccgplugins.h)
Active Directory でドメインに参加していないコンテナーを認証するための資格情報を返します。
構文
HRESULT GetPasswordCredentials(
LPCWSTR pluginInput,
LPWSTR *domainName,
LPWSTR *username,
LPWSTR *password
);
パラメーター
pluginInput
コンテナー ランタイムによって渡される入力文字列。 クライアント実装では、指定された入力文字列を使用して、通常はセキュリティで保護されたストレージ プロバイダーから、出力パラメーターで返される認証資格情報を取得します。 入力文字列は、資格情報仕様ファイルの Host Compute Services (HCS) に提供されます。 詳細については、「解説」を参照してください。
domainName
資格情報のドメイン名
username
資格情報のユーザー名。
password
資格情報のパスワード。
戻り値
戻り値は HRESULT です。 S_OK の値は、呼び出しが成功したことを示します。
注釈
API は同時に呼び出される場合があります。 そのため、開発者は、実装がスレッド セーフであることを確認する必要があります。 さらに、COM オブジェクトはアウトプロセスでアクティブ化され、適切に登録する必要があります。
実装者は、COM CLSID の "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CCG\COMClasses" の下にキーを追加する必要があります。 "CCG\COMClasses" への書き込みアクセスは、SYSTEM アカウントと管理者アカウントに制限されます。
資格情報の指定ファイルの例を次に示します。 このファイルを 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);
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows 10 ビルド 20348 |
サポートされている最小のサーバー | Windows 10 ビルド 20348 |
Header | ccgplugins.h |