【问题标题】:sendto fails with a non administrator user with errorcode 10013sendto 因非管理员用户而失败,错误代码为 10013
【发布时间】:2009-10-26 07:08:58
【问题描述】:

我发现了更多像 ping 一样工作的源代码。我对它们的唯一问题是,如果我使用非管理用户运行程序,那么我会返回错误代码 10013,这意味着:“试图以访问权限禁止的方式访问套接字。”如果我使用管理员组成员的用户运行程序,那么它工作正常。

nResult = sendto (sock, pSendBuffer, sizeof (ICMPheader) + nMessageSize, 0, (SOCKADDR *)&dest, sizeof (SOCKADDR_IN));  
        ::GetSystemTime (&timeSend);  
        ++nPacketsSent;  
        if (nResult == SOCKET_ERROR)  
        {    
        cerr << endl << "An error occured in sendto operation: "  << "WSAGetLastError () = " << WSAGetLastError () << endl;  
                  }  

谁能帮我解决这个问题,或者告诉我为什么非管理员用户不能使用这个代码?如果没有,那么我会应用一些代码,我可以将其用于不是管理员组成员的用户。

提前致谢!

坎皮

【问题讨论】:

    标签: c++ windows sockets


    【解决方案1】:

    如果您想在 Windows 上的应用程序中实现 ping 功能,那么您应该查看 IcmpSendEcho2 函数,而不是尝试使用原始套接字。

    【讨论】:

    • 你是对的!这会容易得多,但我需要 icmplib.lib 来用 ICMPSendEcho2 编译我的程序,但我在任何地方都找不到 icmplib.lib。你知道我在哪里可以买到吗?提前感谢!
    • 你的意思是iphlpapi.lib?这应该包含在您的编译器中(它当然包含在 Visual Stdio 2008 中)。或者,您可以下载 Windows SDK(请参阅msdn.microsoft.com/en-us/windows/bb980924.aspx
    • 不,我的意思是 icmplib.lib。但这是我的错误:)我通常使用无法识别ICMPSendEcho2的Dev-C++,因为它需要icmplib.lib,但我找不到它,所以我用Visual Studio编译,这个不需要icmplib.lib。我的错误,对不起:)
    【解决方案2】:

    您的套接字是SOCK_RAW 类型的吗?在这种情况下,这是设计使然:

    RAW Socket Access Denied to Non-Admin Windows NT 4.0 and Windows 2000 Users

    【讨论】:

      【解决方案3】:

      您的代码是否使用原始套接字?如果这段代码真的实现了 PING 请求,那么它应该使用原始套接字。

      出于安全考虑(考虑过这些考虑的人并没有考虑太多,但这是另一篇文章),原始套接字仅适用于具有管理员权限的帐户。

      【讨论】:

      • 也就是说,只有作为管理员才能发出“ping”命令?似乎世界的运作方式有点不同
      • @Rom:在 Linux 下,ping 由 root 拥有并设置了 setuid 位,因此 RAW 套接字对任何人都有效。在 Windows 下,这取决于您的 Windows 和 ServicePack 版本。我认为 Windows 采用了类似的方法来使其工作......
      • @Malkocoglu:没有 Windows 版本/服务包,您需要成为管理员才能运行“ping”命令。 Windows 中没有等效的“setuid”标志,因为 Windows 上的安全性是在用户级别上实现的(程序拥有运行它们的用户的权限)。请注意,该问题具有“windows”标签
      • @Rom: cmeerw 有正确的答案。我刚刚反汇编了 ping.exe,发现它首先尝试查找/执行提到的函数,如果不成功,它会创建一个 RAW 套接字并手动执行 ping。所以实际上,行为会随着 Windows 版本的变化而变化......
      • IcmpSendEcho2 是 IPHelper API 的一部分,它看起来像系统服务的接口(它还管理 ARP、DHCP、路由...)。这就解释了为什么这个函数调用对所有用户都可用,而不是原始套接字。是的,行为会根据 Windows 版本发生变化:原始套接字出现在 2001 年左右,ping 早就存在了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-10
      • 2020-10-28
      • 2018-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多