Método ICcgDomainAuthCredentials::GetPasswordCredentials (ccgplugins.h)

Devuelve las credenciales para autenticar un contenedor no unido a un dominio con Active Directory.

Sintaxis

HRESULT GetPasswordCredentials(
  LPCWSTR pluginInput,
  LPWSTR  *domainName,
  LPWSTR  *username,
  LPWSTR  *password
);

Parámetros

pluginInput

Cadena de entrada pasada por el entorno de ejecución del contenedor. La implementación del cliente usa la cadena de entrada proporcionada para recuperar las credenciales de autenticación, normalmente de un proveedor de almacenamiento seguro, que se devuelven en los parámetros de salida. La cadena de entrada se proporciona a Host Compute Services (HCS) en un archivo de especificación de credenciales. Para más información, vea la sección Comentarios.

domainName

Nombre de dominio de las credenciales

username

Nombre de usuario de las credenciales.

password

Contraseña de las credenciales.

Valor devuelto

El valor devuelto es hrESULT. Un valor de S_OK indica que la llamada se realizó correctamente.

Comentarios

Se puede llamar a la API simultáneamente. Por lo tanto, el desarrollador debe asegurarse de que su implementación es segura para subprocesos. Además, el objeto COM se activará fuera de proceso y se debe registrar correctamente.

El implementador debe agregar una clave en "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CCG\COMClasses" para su CLSID COM. El acceso de escritura a "CCG\COMClasses" está restringido a las cuentas system y de administrador.

A continuación se muestra un archivo de especificación de credenciales de ejemplo. Para obtener información sobre cómo proporcionar este archivo a Docker, consulte Ejecución de un contenedor con una 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>"
        }
    }
}

Ejemplos

En el ejemplo siguiente se muestra una implementación sencilla de ICcgDomainAuthCredentials. Tenga en cuenta que, con fines ilustrativos, este ejemplo obtiene las credenciales mediante el análisis de la cadena de entrada. Una implementación real almacenaría las credenciales en un almacén de datos seguro y usaría la cadena de entrada para buscar la información de credenciales. Además, las implementaciones del método COM estándar se han omitido en este ejemplo para mayor brevedad.

// 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);

Requisitos

Requisito Value
Cliente mínimo compatible compilación 20348 de Windows 10
Servidor mínimo compatible compilación 20348 de Windows 10
Encabezado ccgplugins.h

Consulte también

ICcgDomainAuthCredentials