Windows凭据提供程序-在接收凭据之前已销毁

时间:2018-08-07 15:23:23

标签: c++ windows com winlogon credential-providers

我正在编写Windows凭据提供程序,由于缺少有关该方法应如何工作的文档,我一直在苦苦挣扎。

我从Windows SDK示例(security/SampleCredentialProvider)开始并对其进行了修改,以便从充当管道的服务器的SYSTEM服务接收凭据。

问题是:当凭据提供程序对象(实现ICredentialProvider的对象)已调用GetCredentialCount时,它尚未通过该管道从SYSTEM服务接收凭据,因此我返回一个0个凭证号(*pdwCount = 0;)。

我不确定这是否是导致问题的原因,但此后不久将调用对象析构函数。反过来,这破坏了我等待系统服务凭证通过的管道,而没有任何效果。

我的问题是:为什么实现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

1 个答案:

答案 0 :(得分:0)

发现了问题:我被困在Ctrl + Alt + Del屏幕上,而我正在查看的凭据提供程序日志是RDP的(我正在使用它来登录并调试问题)。