Méthode ICcgDomainAuthCredentials ::GetPasswordCredentials (gccplugins.h)
Retourne des informations d’identification pour authentifier un conteneur non joint à un domaine avec Active Directory.
Syntaxe
HRESULT GetPasswordCredentials(
LPCWSTR pluginInput,
LPWSTR *domainName,
LPWSTR *username,
LPWSTR *password
);
Paramètres
pluginInput
Chaîne d’entrée transmise par le runtime de conteneur. L’implémentation cliente utilise la chaîne d’entrée fournie pour récupérer les informations d’identification d’authentification, généralement à partir d’un fournisseur de stockage sécurisé, qui sont retournées dans les paramètres de sortie. La chaîne d’entrée est fournie à Host Compute Services (HCS) dans un fichier de spécification d’informations d’identification. Pour plus d’informations, consultez la section Remarques.
domainName
Nom de domaine des informations d’identification
username
Nom d’utilisateur des informations d’identification.
password
Mot de passe des informations d’identification.
Valeur retournée
La valeur de retour est HRESULT. La valeur S_OK indique que l’appel a réussi.
Remarques
L’API peut être appelée simultanément. Par conséquent, le développeur doit s’assurer que son implémentation est thread safe. En outre, l’objet COM est activé hors processus et doit être inscrit de manière appropriée.
L’implémenteur doit ajouter une clé sous « HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CCG\COMClasses » pour son CLSID COM. L’accès en écriture à « GCC\COMClasses » est limité aux comptes SYSTÈME et Administrateur.
Voici un exemple de fichier de spécification d’informations d’identification. Pour plus d’informations sur la fourniture de ce fichier à Docker, consultez Exécuter un conteneur avec un 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>"
}
}
}
Exemples
L’exemple suivant montre une implémentation simple d’ICcgDomainAuthCredentials. Notez que, à des fins d’illustration, cet exemple obtient les informations d’identification en analysant simplement la chaîne d’entrée. Une implémentation réelle stocke les informations d’identification dans un magasin de données sécurisé et utilise la chaîne d’entrée pour localiser les informations d’identification. En outre, les implémentations de méthode COM standard ont été omises de cet exemple par souci de concision.
// 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);
Configuration requise
Condition requise | Valeur |
---|---|
Client minimal pris en charge | Windows 10 Build 20348 |
Serveur minimal pris en charge | Windows 10 Build 20348 |
En-tête | ccgplugins.h |