凭证提供程序和命名管道

时间:2016-06-21 20:21:45

标签: c++ windows com named-pipes credential-providers

我正在尝试通过凭据提供程序中的命名管道与Windows服务进行通信,但我不太确定将命名管道代码放在COM接口的结构中的何处。我正在使用SampleHardwareEventCredentialProvider(来自Microsoft)作为测试平台,我在CSampleCredential.cpp中创建了以下代码:

// Initializes one credential with the field information passed in.
// Set the value of the SFI_USERNAME field to pwzUsername.

HRESULT CSampleCredential::Initialize(
CREDENTIAL_PROVIDER_USAGE_SCENARIO cpus,
const CREDENTIAL_PROVIDER_FIELD_DESCRIPTOR* rgcpfd,
const FIELD_STATE_PAIR* rgfsp
)
{
HRESULT hr = S_OK;

_cpus = cpus;

// Copy the field descriptors for each field. This is useful if you want to vary the field
// descriptors based on what Usage scenario the credential was created for.
for (DWORD i = 0; SUCCEEDED(hr) && i < ARRAYSIZE(_rgCredProvFieldDescriptors); i++)
{
    _rgFieldStatePairs[i] = rgfsp[i];
    hr = FieldDescriptorCopy(rgcpfd[i], &_rgCredProvFieldDescriptors[i]);
}

// Initialize named pipe
if (SUCCEEDED(hr)) {
    HANDLE pipe = CreateNamedPipe("\\\\.\\pipe\\PipeData", PIPE_ACCESS_INBOUND | PIPE_ACCESS_OUTBOUND, PIPE_WAIT, 1, 1024, 1024, 120 * 1000, NULL);
    if (pipe == INVALID_HANDLE_VALUE)
    {
        cout << "Error: " << GetLastError();
    }

    char data[1024];
    DWORD numRead;


    ConnectNamedPipe(pipe, NULL);

    ReadFile(pipe, data, 1024, &numRead, NULL);
}

这显然不起作用,除非我把它放在错误的位置或者没有初始化CP以侦听来自Windows服务的传入消息?我该怎么做?

1 个答案:

答案 0 :(得分:1)

在Windows服务中创建管道。由于您指的是SampleHardwareEventCredentialProvider示例,因此有CommandWindow.h及其cpp文件。

在那里你需要在CCommandWindow :: _ InitInstance方法中使用CreateFile函数打开创建的管道。

然后,您可以使用WriteFile和ReadFile函数轻松地写入和读取管道。

随意询问是否有任何疑问