Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Retourne des informations d’identification pour authentifier un conteneur non joint à un domaine auprès d’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 du conteneur. L’implémentation du client 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 pour les informations d’identification
username
Nom d’utilisateur pour les informations d’identification.
password
Mot de passe des informations d’identification.
Valeur de retour
La valeur de retour est HRESULT. Une valeur de 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 enregistré 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 SYSTEM et Administrateur.
Voici un exemple de fichier de spécification des informations d’identification. Pour plus d’informations sur la fourniture de ce fichier à Docker, consultez Exécuter un conteneur avec un compte 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>"
}
}
}
Examples
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 à partir de cet exemple pour la 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);
Spécifications
| Requirement | Valeur |
|---|---|
| Client minimum requis | Windows 10 Build 20348 |
| serveur minimum pris en charge | Windows 10 Build 20348 |
| Header | gccplugins.h |