【发布时间】:2019-01-14 18:05:16
【问题描述】:
我正在编写一个 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
【问题讨论】:
-
你试过返回
1吗? -
@Fozi 在这种情况下,LogonUI 将随后致电
GetCredentialAt并要求我提供我撒谎的凭据。那时我没有凭证(尚未从管道收到),我无法弥补。我需要保持管道线程打开以从 SYSTEM 服务获取凭据,但 LogonUI 不断关闭我的凭据提供程序(以及我的管道线程)。 -
Windows: 你好,
ICredentialProvider#5,我正在构建 UI。你有几个领域?ICredentialProvider#5: 零。 Windows: KTHXBAI。 ;) -
@Fozi 我不明白.. 我们在谈论 provider::GetCredentialsCount 对吗?它与这里的 UI 字段有什么关系?我的理由是:'如果我在另一个线程中的管道还没有返回任何凭据,我将返回 0,如果有,我将返回 1'。这有意义吗?
-
@Fozi 另外,如果凭据提供程序具有 0 个 UI 字段,则绝对没有理由将其销毁。没有 UI 并不意味着可以卸载提供程序(任何文档中都没有提及)
标签: c++ windows com winlogon credential-providers