CreateProcessWithLogonw:无法启动过程
CreateProcessWithLogonW : unable to start process
嗨,我是编程的新手。请有人帮我。
我正试图从服务中启动一个pocess。我需要通过提示用户输入管理凭据来启动新过程。
我试图使用CreateProcessWithLogonW()
。
我使用正确的功能。我试图将输入用户名,密码和域作为本地主机。我给了我需要启动的.exe文件的完整pathe。
这是代码。
CreateProcessWithLogonW(L"Administrator",
L"localhost",
L"password",
0,
NULL,
L"c:myupdatesmyapp.exe",
NORMAL_PRIORITY_CLASS | CREATE_CONSOLE,
NULL,
NULL,
&si,
&pi);
Si.cb = sizeof(si);
Si.lpDesktop = L"winsta0\default";
但是这个过程从未开始。你们能告诉我我做错了什么。我需要对Promt用户做些什么才能输入管理员的凭据,而不是对其进行硬编码。
createProcess*函数都不会进行任何宣传。他们是低级API,对GUI一无所知。
如果要提示用户,请使用ShellExecuteEx
使用runas
命令。Windows将首先要求提升并提示获得凭据。
您可能还需要正确逃脱程序字符串:
L"c:myupdatesmyapp.exe"
至少应该是:
L"c:\myupdates\myapp.exe"
坦率地说,此代码从不当设置到传递给API本身的参数有很多错误。我建议您阅读更多。
一个问题是将字符串文字作为命令行参数传递,因为该参数必须可修改。从CreateProcessWithLogon()
与命令行参数有关:
该功能可以修改此字符串的内容。因此,此参数不能是仅读取内存的指针(例如const变量或文字字符串)。如果此参数是恒定字符串,则该功能可能会导致访问违规。
您还需要逃脱后斜线。更改为:
WCHAR cmdLine[] = L"c:\myupdates\myapp.exe"; /* 'cmdLine' is a
copy of the string
literal. */
和通过cmdLine
。
在任何Winapi功能故障之后检查GetLastError()
,因为它将告知您失败的原因。
也许为时已晚。但是,这可能对他人有帮助。如果使用CreateProcessWithLogonW
函数,并且正在使用Default
桌面,则只需将lpDesktop
作为null。
如果lpDesktop
不是null,则必须在台式机和WinStation的DACL
LookupAccountNamean
)作为ACE
因此,这是您为桌面添加ACE
所需的步骤:
- 使用
OpenDesktop
获取桌面句柄,使用正确的DWDesiredAccess - 使用
GetSecurityInfo
和DACL_SECURITY_INFORMATION
作为SecurityInfo
获取 - 从您的
Security Descriptor
获取DACL
- 添加用户SID的SID添加
AddAccessAllowedAce
- 将修改的
DACL
设置为桌面句柄
Security Descriptor
现在重复winsta0
WinStation
furious先生在图书馆的纪念日帮助我解决了这个问题。
访问违规归功于LPCommandline参数。这是为了进行可编辑的内存,LPWSTR和API函数确实修改了缓冲区。但是您将指针传递给非修道的内存。
但是有一个更基本的问题。您说您想提示从服务获得凭据。服务不应显示UI,并且在现代版本的Windows中,服务根本无法显示UI。您的设计有缺陷,您需要重新考虑它。
- 递归函数计算序列中的平方和(并输出过程)
- 如何创建一个空的全局类并在启动时实例化它
- 是否删除在对象构造过程中创建的对象
- 即使我读取了所有内容,在FIFO上打开的QSocketNotifier也会一直启动
- 使用 std::string () const 函数启动线程或未来
- 如何在鼠标挂钩过程中检测拖动
- 如何修复valgrind启动时的致命错误(与libc6-dbg和libc6-dbg:i386连接)
- 此测试()中发生了什么意外过程?为什么总是覆盖 ch[0 1 2..]?
- clang 插件:在编译过程中修改 AST
- 将向量作为类>(值)<向量启动和向量<类>[值]有什么区别
- Qprocess启动的嵌套远程过程仍然是僵尸
- 如何在启动过程中崩溃时使用 gdb 调试可执行文件
- 查询/查找启动过程窗口
- 将CTRL C事件发送到使用Windows上使用Qprocess启动的过程
- CreateProcessWithLogonw:无法启动过程
- QProcess启动过程(搅拌机.exe)具有多个参数
- 创建进程不会用参数启动过程
- 启动时的C++协调过程
- Qt创建gst启动过程
- 启动过程中程序退出,代码为127