0

我知道在 GINA 中找到大师并不容易,但我的问题最接近进程间通信(IPC),我在非托管 C++ 中编写了我的自定义 GINA,我将它包括一个检查指纹有效性的方法,供用户尝试登录时,该函数会调用c#编写的正在运行的系统windows服务中的一些方法,代码如下:

在 GINA 中,非托管 c++

if(Fingerprint.Validate(userName,finerprintTemplate)
{
    //perform login
}

在 Windows 服务中,C#

public class Fingerprint
{
   public static bool Validate(string userName, byte[] finerprintTemplate)
   {
      //Preform Some code to validate fingerprintTemplate with userName
      //and retuen result
   }
}

有谁知道如何在 GINA 和 windows 服务之间进行这种通信,或者只是在 c++ 编写的服务和 C# 编写的服务之间进行通信。

谢谢

4

4 回答 4

4

与服务(或大多数可能需要跨越会话/桌面边界的 IPC)进行通信的规范方法是命名管道。您也可以使用邮槽,但是您必须处理重复问题,因为邮槽消息会在所有已安装的协议中被复制,因此您需要某种标记系统……有点混乱。

请参阅 CreateNamedPipe 的文档并从那里着手。我已经使用管道在 C++ 和 C# 之间进行了交谈:互操作有点混乱(二进制消息),但它是可行的。这里有一些 C# 管道的示例代码(来自双方)。

为特定服务使用管道来服务通信问题的好处是,如果需要,您可以稍后扩展设计以支持 UI。

于 2009-02-07T15:41:20.270 回答
3

NISGINA是一个开源 GINA 插件,用于对 NIS 目录进行身份验证。如果您还没有看到这个,这是我所知道的开源 GINA 插件的唯一示例。如果您还没有,您可能会发现阅读源代码是值得的。

请注意,从 Windows Vista 开始,GINA 已被弃用,并被另一个名为Credential Provider Architecture 的 API 取代。

于 2009-02-07T15:37:39.357 回答
1

我强烈建议您使用命名管道。如果您使用的是 .Net 3.5 或更高版本,它们在 C# 方面快速、易于使用,并且在 C++ 方面相对容易(提供大量示例)。最重要的是,通过应用简单的安全描述符非常容易保护。

于 2009-02-07T15:29:06.033 回答
0

我很好奇您是否遵循建议的“答案”并尝试了命名管道路线?根据此链接和我自己的经验,GINA 在预身份验证(会话 0)上下文中运行,任何从非托管 C++ GINA dll 访问命名管道的尝试都将导致错误 #5“访问被拒绝”。

我相信 Mailslots 可能是在该级别实际可用的唯一可用的 Windows IPC 机制,但我什至不确定它是否会起作用(还没有尝试过。)

于 2009-07-21T01:08:20.657 回答