ICcgDomainAuthCredentials::GetPasswordCredentials 方法 (ccgplugins.h)
傳回認證,以使用 Active Directory 驗證未加入網域的容器。
語法
HRESULT GetPasswordCredentials(
LPCWSTR pluginInput,
LPWSTR *domainName,
LPWSTR *username,
LPWSTR *password
);
參數
pluginInput
容器運行時間傳入的輸入字串。 用戶端實作會使用提供的輸入字串來擷取驗證認證,通常是從輸出參數中傳回的安全記憶體提供者。 輸入字串會提供給認證規格檔案中的主機計算服務 (HCS) 。 如需詳細資訊,請參閱備註一節。
domainName
認證的功能變數名稱
username
認證的用戶名稱。
password
認證的密碼。
傳回值
傳回值為 HRESULT。 值S_OK表示呼叫成功。
備註
API 可以同時呼叫。 因此,開發人員必須確定其實作是安全線程。 此外,COM 物件將會從進程外啟動,而且必須適當地註冊。
實作者必須在 「HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CCG\COMClasses」 底下為其 COM CLSID 新增密鑰。 “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);
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | Windows 10 組建 20348 |
最低支援的伺服器 | Windows 10 組建 20348 |
標頭 | ccgplugins.h |