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 |