我正在编写一个通过.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套接字库?
答案 0 :(得分:2)
访问RAW套接字需要Windows 2000及更高版本的管理员权限,MSDN上对此进行了描述:
原始套接字提供了操作底层传输的功能,因此它们可用于构成安全威胁的恶意目的。因此,只有Administrators组的成员才能在Windows 2000及更高版本上创建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()
函数。