在XP上拒绝远程命名管道连接

时间:2009-11-06 19:05:34

标签: windows-xp named-pipes

我有一个我想要实现的简单设计。

基于C ++的单个服务器应用程序创建一个只写命名管道。多个客户端(C ++或C#)以只读方式连接并侦听状态消息。

我将此工作用于本地进程,但我无法将其他主机上的客户端连接到服务器。

服务器在XP SP2上运行(可能是SP3)。客户端在Win7上运行。

    SECURITY_DESCRIPTOR sd;
    SECURITY_ATTRIBUTES sa;
    SID_IDENTIFIER_AUTHORITY siaWorldSidAuthority = SECURITY_WORLD_SID_AUTHORITY;
    PSID psidWorldSid = (PSID) LocalAlloc  (LPTR, GetSidLengthRequired(1));
    InitializeSid(psidWorldSid, &siaWorldSidAuthority, 1);
    *(GetSidSubAuthority(psidWorldSid, 0)) = SECURITY_WORLD_RID;
    InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
    SetSecurityDescriptorGroup(&sd, psidWorldSid, TRUE);
    ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES));
    sa.nLength = sizeof(SECURITY_ATTRIBUTES);
    sa.lpSecurityDescriptor = &sd;
    sa.bInheritHandle = FALSE;

    HANDLE hPipe = CreateNamedPipe(
        lpszPipename,               // name
        PIPE_ACCESS_OUTBOUND,       // write access 
        PIPE_TYPE_MESSAGE |             // message type pipe 
        PIPE_READMODE_MESSAGE |         // message-read mode 
        PIPE_WAIT,                      // blocking mode 
        PIPE_UNLIMITED_INSTANCES,   // max. instances 
        BUFSIZE,                    // output buffer size 
        BUFSIZE,                    // input buffer size 
        PIPE_TIMEOUT,               // client time-out 
        NULL /*&sa*/);                      // no security attribute

在最终参数中用& sa替换NULL无效。 C#客户端代码如下所示。

        SafeFileHandle pipeHandle = 
           CreateFile(
              pipeName,
              GENERIC_READ,
              0,
              IntPtr.Zero,
              OPEN_EXISTING,
              0,
              IntPtr.Zero);

我在这里错过了什么愚蠢的事情?

1 个答案:

答案 0 :(得分:0)

你检查过防火墙了吗?端口445是否被阻止?