我正在编写一个通过。net调用OpenOffice.org API的程序。http://wiki.openoffice.org/wiki/Documentation/DevGuide/ProUNO/CLI/Writing_Client_Programs上的文档说:
For OOoX代码如下:
//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套接字库?
访问RAW套接字需要Windows 2000及更高版本的管理员权限,这在MSDN上有描述:
TCP/IP原始套接字
原始套接字提供了操作底层传输的能力,因此它们可以用于构成安全威胁的恶意目的。因此,在Windows 2000及更高版本上,只有Administrators组的成员才能创建SOCK_RAW类型的套接字。
…
注意使用SOCK_RAW类型的套接字需要管理员权限。运行使用原始套接字的Winsock应用程序的用户必须是本地计算机上Administrators组的成员,否则原始套接字调用将失败,并显示错误代码WSAEACCES。在Windows Vista及更高版本中,对原始套接字的访问在套接字创建时强制执行。在Windows的早期版本中,对原始套接字的访问是在其他套接字操作期间强制执行的。
没有办法绕过这个限制。另一方面,如果您的目的只是一般地初始化Winsock,那么您不需要创建RAW套接字来完成此操作。创建一个TCP (SocketType.Stream
和ProtocolType.TCP
)或UDP (SocketType.DGram
和ProtocolType.UDP
)套接字,这是不受限制的,最有可能的是OOo实际上要在内部使用。或者,您可以使用PInvoke直接调用Winsock的WSAStartup()
函数。