为什么Windows不允许在模仿其他用户时启动WinSock

如果使用CreateProcessWithLogonW或CreateProcessAsUserW创build进程,则使用我自己的程序或其他程序调用winsock时不能运行。 它在创build套接字时返回这个错误:

WSAEPROVIDERFAILEDINIT 10106 

服务提供商未能初始化。

 The requested service provider could not be loaded or initialized. 

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

但是, WSAStartup似乎没有任何错误。 只需使用WSASocket创build套接字即可返回此信息。

更新:

错误:

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

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

Solutions Collecting From Web of "为什么Windows不允许在模仿其他用户时启动WinSock"

也许你执行进程的用户不允许使用TCP / IP协议栈?

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

你必须有法令作为经营权

我遇到了完全相同的问题,这是由于环境(!):显然WinSock希望设置一个有效的SystemRoot环境变量。 在我的情况下,我通过只指定一个特定于我的应用程序的环境变量(不继承调用者的环境)来调用CreateProcess() ),并且失败。

检查是否通过将NULL传递给lpEnvironment来继承调用者的环境或指定有效的SystemRoot环境变量来创建流程。

完全没有记录的AFAIK,但它为我工作。

可能是您缺少以另一个用户身份运行进程所需的权限。 尝试通过调用OpenProcessToken来获取访问令牌的句柄,并通过调用AdjustTokenPrivileges来添加SE_IMPERSONATE_NAME,然后调用CreateProcessAsUserW。 我自己虽然没有尝试过。
Python中的代码片段与win32调用类似

运行Process Monitor并查看它是否无法找到文件或注册表项。 也许模拟用户的配置文件没有加载和Winsock(或它正在尝试加载的服务提供商)正在寻找的东西。

总是在main的顶部附近启动WinSock并保持运行。 启动winsock的必要性是架构的一个意外,而不是任何问题领域的萌芽。