CreateProcessWithLogonw:无法启动过程

CreateProcessWithLogonW : unable to start process

本文关键字:启动 过程 CreateProcessWithLogonw      更新时间:2023-10-16

嗨,我是编程的新手。请有人帮我。

我正试图从服务中启动一个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

中输入用户的SID(使用LookupAccountNamean)作为ACE

因此,这是您为桌面添加ACE所需的步骤:

  1. 使用OpenDesktop获取桌面句柄,使用正确的DWDesiredAccess
  2. 使用GetSecurityInfoDACL_SECURITY_INFORMATION作为SecurityInfo
  3. 获取Security Descriptor
  4. 从您的Security Descriptor获取DACL
  5. 添加用户SID的SID添加AddAccessAllowedAce
  6. 将修改的DACL设置为桌面句柄

现在重复winsta0 WinStation

的这些步骤

furious先生在图书馆的纪念日帮助我解决了这个问题。

访问违规归功于LPCommandline参数。这是为了进行可编辑的内存,LPWSTR和API函数确实修改了缓冲区。但是您将指针传递给非修道的内存。

但是有一个更基本的问题。您说您想提示从服务获得凭据。服务不应显示UI,并且在现代版本的Windows中,服务根本无法显示UI。您的设计有缺陷,您需要重新考虑它。