如何在不同用户下复制目标进程的套接字

时间:2008-12-11 16:11:43

标签: c++ winapi sockets

我遇到了WSADuplicateSocket的问题,我正在使用它来复制套接字以供其他进程使用。它可以在两个进程在同一个Windows用户下运行时查找,但在不同用户下运行时失败并显示错误代码10022(WSAEINVAL)。

具体来说,调用WSADuplicateSocket的进程在管理员用户帐户下运行,目标进程在系统帐户下运行。

在网上搜索,我发现了其他问题,但没有解决方案。有谁知道解决这个问题的方法?

这是当前的代码:

bool Duplicate(
    SOCKET s,
    WSAPROTOCOL_INFO* pSocketInfo,
    int targetProcessID,
    int& errorNum
)
{
    memset(pSocketInfo, 0, sizeof(WSAPROTOCOL_INFO));
    if (::WSADuplicateSocket(s, targetProcessID, pSocketInfo)
        == SOCKET_ERROR)
    {
        errorNum = ::WSAGetLastError();
        return false;
    }
    return true;
}

2 个答案:

答案 0 :(得分:1)

MSDN在这个问题上有点不清楚,我没有时间自己测试,但是作为内核对象的套接字句柄附加了一个安全描述符,不允许访问它除了创作者以外的任何人。

尝试调用GetKernelObjectSecurity来检查附加到句柄的ACL,然后尝试调用SetKernelObjectSecurity以允许其他用户访问句柄。也许那么WSADuplicateSocket会正常工作吗?

答案 1 :(得分:1)

目标用户(系统)可能没有访问网络的权限吗?我认为围绕windows xp创建了一个特殊的服务帐户(网络服务)来分离需要访问网络的服务。你有没有为系统以外的其他用户测试你的代码?

免费获取贴纸的机会↓↓↓
豫ICP备18024241号-1