Я пишу провайдер учетных данных Windows, и я действительно борюсь из-за отсутствия документации о том, как это должно работать.
Я начал с примера Windows SDK (security/SampleCredentialProvider
) и изменил его, чтобы получить учетные данные от службы SYSTEM, которая действует как сервер через канал.
Проблема заключается в следующем: когда объект провайдера учетных данных (тот, который реализует ICredentialProvider
) имеет GetCredentialCount
вызван, он еще не получил учетные данные от службы SYSTEM через этот канал, поэтому я возвращаю 0 учетных данных (*pdwCount = 0;
).
Я не уверен, если это является причиной проблемы, но объект деструктор называется вскоре после этого. Это, в свою очередь, разрушает канал, в котором я ожидал передачи учетных данных службы SYSTEM, и ничего не работает.
Мой вопрос: почему объект, который реализует ICredentialProvider
уничтожены? Как я могу избежать его уничтожения, чтобы иметь поставщика Подождите для учетных данных, переданных через канал, а затем уведомить LogonUI, что у нас есть новые учетные данные?
Я прилагаю некоторые события из окна просмотра событий Windows, касающиеся моего модуля провайдера учетных данных:
- Credential provider object is created
- SetUsageScenario is called, only CPUS_LOGON is supported
- Advise is called, pcpe parameter is saved and AddRef'd
- GetCredentialCount, 0 is returned (no credential received yet)
- UnAdvise is called (this is unexpected, does this mean I can no longer pass credentials? Why is this called?)
- pipe to receive credentials is created
- Credential provider object's destructor is called -> pipe is destroyed and everything terminates
Нашел проблему: я застрял на экране Ctrl + Alt + Del, и журнал провайдера учетных данных, на который я смотрел, был RDP (я использовал его для входа и устранения проблемы).
Других решений пока нет …