0

嗨,我对编程完全陌生。请有人帮助我。

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

我试图使用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";

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

4

5 回答 5

1

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

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

您还需要转义反斜杠。改成:

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

并通过cmdLine

在任何 WINAPI 功能失败检查后GetLastError(),它会通知您失败的原因。

于 2012-11-02T16:50:39.283 回答
1

您可能还想正确转义程序字符串:

L"c:\myupdates\myapp.exe"

至少应该是:

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

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

于 2012-11-02T16:52:06.207 回答
1

CreateProcess* 函数都不会做任何提示。它们是低级 API,对 GUI 一无所知。

如果要提示用户,请使用ShellExecuteExwithrunas命令。Windows 将首先询问提升权限,然后提示输入凭据。

于 2012-11-02T17:06:39.580 回答
1

也许现在帮助你已经太晚了。但它可能对其他人有帮助。如果您使用该CreateProcessWithLogonW功能并且正在使用Default桌面,请保留lpDesktop为 NULL。

如果lpDesktop不是 Null,则必须在桌面和 winstation中输入用户的 sid(使用LookupAccountNamean)作为 aACEDACL

因此,您必须执行以下步骤才能ACE为桌面添加一个:

  1. 获取桌面句柄OpenDesktop,使用正确的 dwDesiredAccess
  2. 获取Security DescriptorwithGetSecurityInfoDACL_SECURITY_INFORMATIONas securityinfo
  3. DACL你的Security Descriptor
  4. AddAccessAllowedAce使用用户 sid 的 sid添加
  5. 将修改设置DACL为您的桌面句柄

winsta0现在为winstation重复这些步骤

纪录片中愤怒先生的评论帮我解决了这个问题。

于 2015-05-28T12:47:15.417 回答
0

访问冲突归结为 lpCommandLine 参数。这意味着可编辑内存,LPWSTR 和 API 函数确实修改了缓冲区。但是你传递了一个指向不可修改内存的指针。

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

于 2012-11-03T21:13:14.877 回答