2

我正在编写一个通过 .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 套接字库?

4

1 回答 1

2

访问 RAW 套接字需要 Windows 2000 及更高版本的管理员权限,这在 MSDN 上有描述:

TCP/IP 原始套接字

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

...

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

没有办法绕过这个限制。另一方面,如果您的意图只是一般地初始化 Winsock,那么您不需要创建 RAW 套接字来执行此操作。改为创建一个 TCP ( SocketType.Streamand ProtocolType.TCP) 或 UDP ( SocketType.DGramand ProtocolType.UDP) 套接字,它们不受限制,并且很可能无论如何 OOo 将在内部实际使用。或者,您可以使用 PInvoke 直接调用 Winsock 的WSAStartup()函数。

于 2013-04-18T22:12:11.963 回答