凭据提供程序和命名管道

Posted

技术标签:

【中文标题】凭据提供程序和命名管道【英文标题】:Credential Provider and Named Pipes 【发布时间】:2016-06-21 20:21:44 【问题描述】:

我正在尝试通过凭据提供程序中的命名管道与 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】:

在您的 Windows 服务中创建管道。由于您指的是 SampleHardwareEventCredentialProvider 示例,因此存在 CommandWindow.h 及其 cpp 文件。 因为您需要使用 CCommandWindow::_InitInstance 方法中的 CreateFile 函数打开创建的管道。 然后,您可以使用 WriteFile 和 ReadFile 函数轻松地写入和读取管道。 如有任何疑问,请随时询问

【讨论】:

以上是关于凭据提供程序和命名管道的主要内容,如果未能解决你的问题,请参考以下文章

Unidac连接出错:命名管道提供程序:管道的另一端上无任何进程.

如何修复错误“命名管道提供程序,错误 40 - 无法打开与“SQL Server”的连接?

使用命名管道向 ffmpeg 提供输入

Java中的命名管道和多线程

SQL Server 错误“命名管道提供程序:无法打开与 SQL Server [53] 的连接”

Java中命名管道的并发读/写(在Windows上)