如何在没有管理员权限的情况下初始化Windows套接字库

时间:2013-04-18 18:16:41

标签: .net windows sockets winsock

我正在编写一个通过.NET调用OpenOffice.org API的程序。 http://wiki.openoffice.org/wiki/Documentation/DevGuide/ProUNO/CLI/Writing_Client_Programs上的文档说:

对于OOo 3.x,代码是这样的:

//C# example for OOo 3.x
//Workaround which is needed when using a socket connection
//This will initialize the Windows socket library.
System.Net.Sockets.Socket s = new System.Net.Sockets.Socket(
AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);

在Windows XP和Windows Server 2003上运行正常,但在Windows 7上它失败了:

  

尝试以其禁止的方式访问套接字   访问权限

我理解是因为套接字类型是原始的,程序没有运行管理员权限。所以我的问题是:如何在没有管理员权限的情况下初始化Windows套接字库?

1 个答案:

答案 0 :(得分:2)

访问RAW套接字需要Windows 2000及更高版本的管理员权限,MSDN上对此进行了描述:

TCP/IP Raw Sockets

  

原始套接字提供了操作底层传输的功能,因此它们可用于构成安全威胁的恶意目的。因此,只有Administrators组的成员才能在Windows 2000及更高版本上创建SOCK_RAW类型的套接字。

     

...

     

注意要使用SOCK_RAW类型的套接字,需要具有管理权限。运行使用原始套接字的Winsock应用程序的用户必须是本地计算机上Administrators组的成员,否则原始套接字调用将失败,错误代码为WSAEACCES。在Windows Vista及更高版本中,在创建套接字时强制访问原始套接字。在早期版本的Windows中,在其他套接字操作期间强制访问原始套接字。

没有办法解决这个限制。另一方面,如果您的目的只是初始化Winsock,那么您不需要创建RAW套接字来执行此操作。创建一个TCP(SocketType.StreamProtocolType.TCP)或UDP(SocketType.DGramProtocolType.UDP)套接字,它们不受限制,很可能是OOo实际上将在内部使用的内容无论如何。或者,您可以使用PInvoke直接调用Winsock的WSAStartup()函数。