2009-02-07 60 views
0

我知道在GINA中找到主控并不容易,但我的问题最接近进程间通信(IPC),我在非托管C++中编写了自定义GINA,我将它包含在一个方法中,以检查对于用户指纹的有效尝试登录时,该功能将调用一些方法写在C#中的运行系统窗口服务,代码如下:登录方法使用GINA的自定义

在GINA

,在窗口服务托管C++

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

,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

与服务通信的规范方法的另一个API替代的(或大多数IPC潜在需要跨会话/桌面界面)是一个命名管道。你也可以使用邮筒,但是你必须处理重复问题,因为邮筒消息在所有已安装的协议中都被欺骗了,所以你需要某种标签系统......变得有点麻烦。

查看CreateNamedPipe的文档,并从那里开始工作。我曾经使用过管道在C++和C#之间讨论过:interop有点混乱(二进制消息),但它可以。有一些C#管道的示例代码(来自两侧)here

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

+1

唯一需要注意的我想补充关于使用邮筒是因为它们不是安全的,对于服务间通信而言,这通常是一种破坏行为。 – 2009-02-07 16:00:50

+0

这就够了。不是我认为他应该使用它们,我只是一个狂热的完美主义者,当谈到回答问题时:-) – 2009-02-07 22:01:14

1

我强烈建议您使用命名管道。如果您使用的是.NET 3.5或更高版本,并且从C++方面(包含大量示例)相对容易,它们可以从C#端快速轻松地使用。最重要的是通过应用一个简单的安全描述符非常容易确保安全。

0

我很好奇,如果你按照建议的“答案”,并试图命名管道路线?根据this link和我自己的经验,GINA在预先验证的(Session 0)上下文中运行,并且任何尝试从非托管C++ GINA dll访问命名管道都将导致错误#5“访问被拒绝”。

我相信邮筒可能是唯一可用的Windows IPC机制,实际上是可以在这个水平,但我甚至不能肯定,将工作(没试过。)