Поделиться через


Метод ICcgDomainAuthCredentials::GetPasswordCredentials (ccgplugins.h)

Возвращает учетные данные для проверки подлинности контейнера, не присоединенного к домену, с помощью Active Directory.

Синтаксис

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

Параметры

pluginInput

Входная строка, передаваемая средой выполнения контейнера. Клиентская реализация использует предоставленную входную строку для получения учетных данных проверки подлинности, как правило, из защищенного поставщика хранилища, которые возвращаются в выходных параметрах. Входная строка предоставляется службам вычислений узла (HCS) в файле спецификации учетных данных. Дополнительные сведения см. в разделе Примечания.

domainName

Доменное имя для учетных данных

username

Имя пользователя для учетных данных.

password

Пароль для учетных данных.

Возвращаемое значение

Возвращаемое значение — HRESULT. Значение S_OK указывает, что вызов выполнен успешно.

Комментарии

API можно вызывать параллельно. Поэтому разработчик должен убедиться, что его реализация является потокобезопасной. Кроме того, COM-объект будет активирован вне среды и должен быть зарегистрирован соответствующим образом.

Разработчик должен добавить ключ в разделе "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CCG\COMClasses" для СВОЕГО COM CLSID. Доступ на запись к "CCG\COMClasses" ограничен учетными записями СИСТЕМ и администраторов.

Ниже приведен пример файла спецификации учетных данных. Сведения о предоставлении этого файла в Docker см. в статье Запуск контейнера с помощью 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>"
        }
    }
}

Примеры

В следующем примере показана простая реализация ICcgDomainAuthCredentials. Обратите внимание, что в качестве иллюстрации этот пример получает учетные данные путем простого анализа входной строки. Реальная реализация будет хранить учетные данные в защищенном хранилище данных и использовать входную строку для поиска учетных данных. Кроме того, стандартные реализации com-метода были опущены в этом примере для краткости.

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

Требования

Требование Значение
Минимальная версия клиента сборка Windows 10 20348
Минимальная версия сервера сборка Windows 10 20348
Верхняя часть ccgplugins.h

См. также раздел

ICcgDomainAuthCredentials