【问题标题】:Windows Credential Provider - destroyed before receiving credentialsWindows 凭据提供程序 - 在接收凭据之前销毁
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2021-09-16
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    相关资源
    最近更新 更多