Partager via


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

Voir aussi

ICcgDomainAuthCredentials