CreateProcessWithLogonW:无法启动进程

时间:2012-11-02 16:47:17

标签: c++ windows winapi windows-7 windows-services

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

我正试图从服务开始。 我需要通过提示用户输入管理员凭据来启动新流程。

我试图使用CreateProcessWithLogonW()

我是否使用了正确的功能。 我试图将输入用户名,密码,域名作为localhost。我完全打开了我需要启动的.exe文件。

这是一段代码。

CreateProcessWithLogonW(L"Administrator",
                        L"localhost",
                        L"password",
                        0,
                        NULL,
                        L"c:\myupdates\myapp.exe",
                        NORMAL_PRIORITY_CLASS | CREATE_CONSOLE,
                        NULL,
                        NULL,
                        &si,
                        &pi);

Si.cb = sizeof(si);
Si.lpDesktop = L"winsta0\\default";

但这个过程从未开始过。你能告诉我我做错了吗? 我需要做些什么来促使用户输入管理员凭据而不是硬编码。

5 个答案:

答案 0 :(得分:1)

一个问题是将字符串文字作为命令行参数传递,因为该参数必须是可修改的。从CreateProcessWithLogon()开始,与命令行参数相关:

  

该函数可以修改此字符串的内容。因此,此参数不能是只读内存的指针(例如const变量或文字字符串)。如果此参数是常量字符串,则该函数可能会导致访问冲突。

您还需要逃避反斜杠。改为:

WCHAR cmdLine[] = L"c:\\myupdates\\myapp.exe"; /* 'cmdLine' is a
                                                  copy of the string
                                                  literal. */

并改为通过cmdLine

任何WINAPI函数失败后检查GetLastError(),因为它会告知您失败的原因。

答案 1 :(得分:1)

您可能也希望正确转义程序字符串:

L"c:\myupdates\myapp.exe"

至少应该是:

L"c:\\myupdates\\myapp.exe"

坦率地说,这个代码存在很多问题,从SI的不正确设置到传递给API本身的参数。我建议你多读一读。

答案 2 :(得分:1)

任何CreateProcess *函数都不会执行任何操作。它们是低级API,对GUI一无所知。

如果您希望提示用户,请使用ShellExecuteExrunas命令。 Windows将首先请求提升权限,然后提示输入凭据。

答案 3 :(得分:0)

访问冲突由lpCommandLine参数决定。这意味着可编辑的内存,LPWSTR和API函数确实修改了缓冲区。但是你将指针传递给不可修改的内存。

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

答案 4 :(得分:0)

也许为你提供帮助已经太晚了。但它可能对其他人有所帮助。如果您使用CreateProcessWithLogonW函数并且使用的是Default桌面,请将lpDesktop保留为NULL。

如果lpDesktop不是空,则必须在桌面和winstation的LookupAccountNamean

中输入用户的sid(使用ACE)作为DACL

以下是为桌面添加ACE时必须执行的步骤:

  1. 使用OpenDesktop获取桌面句柄,使用正确的dwDesiredAccess
  2. 获取Security Descriptor GetSecurityInfoDACL_SECURITY_INFORMATION作为securityinfo
  3. DACL
  4. 获取Security Descriptor
  5. 使用用户sid的sid
  6. 添加AddAccessAllowedAce
  7. 将修改后的DACL设置为桌面句柄
  8. 现在重复winsta0 winstation

    的步骤

    先生documantary中的Furious先生帮助我解决了这个问题。