7

如果使用 CreateProcessWithLogonW 或 CreateProcessAsUserW 创建进程,则使用我自己的程序或其他程序我无法在调用时运行 winsock。当我创建套接字时它返回此错误:

WSAEPROVIDERFAILEDINIT 10106

服务提供者初始化失败。

The requested service provider could not be loaded or initialized.

如果无法加载服务提供者的 DLL(LoadLibrary 失败)或提供者的 WSPStartup 或 NSPStartup 函数失败,则会返回此错误

.

但是,WSAStartup似乎没有错误。只需使用 WSASocket 创建套接字就会返回此内容。

更新:

错误:

LoadUserProfile:错误代码 2。找不到指定的文件

AdjustTokenPrivs:错误代码 5。访问被拒绝

4

6 回答 6

8

我遇到了完全相同的问题,这是由于环境(!):显然 WinSock 需要SystemRoot设置一个有效的环境变量。就我而言,我CreateProcess()通过仅指定一个特定于我的应用程序的环境变量来调用(不继承调用者的环境),但它失败了。

通过传递NULLtolpEnvironment来继承调用者的环境或指定有效的SystemRoot环境变量来检查您是否创建了进程。

完全无证的 AFAIK,但它对我有用。

于 2011-01-20T07:36:10.360 回答
3

您必须拥有作为运营特权的行为

于 2009-10-19T15:20:51.947 回答
3

也许您执行该进程的用户不允许使用 TCP/IP 堆栈?

尝试使用不是您自己帐户的管理员用户启动应用程序。

于 2009-10-12T14:23:46.583 回答
1

可能是您缺乏以其他用户身份运行该进程所需的权限。尝试通过调用 OpenProcessToken 获取访问令牌的句柄,并通过调用 AdjustTokenPrivileges 添加 SE_IMPERSONATE_NAME,然后调用 CreateProcessAsUserW。我自己还没有尝试过。
Python 中的代码片段可以对 win32 调用执行类似操作

于 2009-10-14T10:36:37.993 回答
0

始终在 main 顶部附近启动 WinSock 并让它运行。启动winsock的需要是架构的意外,不再是任何问题领域的日耳曼。

于 2009-10-19T15:27:43.993 回答
0

在它上面运行进程监视器,看看它是否找不到文件或注册表项。也许模拟用户的配置文件没有加载,Winsock(或它试图加载的服务提供商)正在那里寻找东西。

于 2009-10-12T15:14:45.577 回答