c++ - 为什么 Windows 不允许在模拟另一个用户时启动 WinSock

标签 c++ windows winsock impersonation wsastartup

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

WSAEPROVIDERFAILEDINIT 10106

Service provider failed to initialize.

The requested service provider could not be loaded or initialized.

This error is returned if either a service provider's DLL could not be loaded (LoadLibrary failed) or the provider's WSPStartup or NSPStartup function failed

.

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

更新:

Errors:

LoadUserProfile: Error Code 2. Can't find file specified

AdjustTokenPrivs: Error Code 5. Access Denied

最佳答案

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

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

完全没有记录的 AFAIK,但它对我有用。

关于c++ - 为什么 Windows 不允许在模拟另一个用户时启动 WinSock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1554878/

相关文章:

c++ - 如何专门化具有多个参数的函数模板?

windows - 在 Windows 10 上安装 Rust 时如何修复 "detected conflict"错误?

python - 为什么在 kivy 样式文件中使用尖括号时不断收到 "invalid syntax"错误?

c++ - C++获取HTML源

c++ - 私有(private)静态成员函数有什么用?

c++ - 如何创建另一个进程内存的二进制/十六进制转储?

C++11:我们什么时候需要为默认成员函数专门化 "=default"?

windows - CheckBox disabled - 仅禁用复选框,不禁用标签

c++ - 无法连接到服务器(通过远程连接)

大约 2 小时后 WCF 客户端错误 "Insufficient winsock resources available"