嗨,我是编程新手。请有人帮助我。
我正试图从服务开始。 我需要通过提示用户输入管理员凭据来启动新流程。
我试图使用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";
但这个过程从未开始过。你能告诉我我做错了吗? 我需要做些什么来促使用户输入管理员凭据而不是硬编码。
答案 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一无所知。
如果您希望提示用户,请使用ShellExecuteEx
和runas
命令。 Windows将首先请求提升权限,然后提示输入凭据。
答案 3 :(得分:0)
访问冲突由lpCommandLine参数决定。这意味着可编辑的内存,LPWSTR和API函数确实修改了缓冲区。但是你将指针传递给不可修改的内存。
但是有一个更基本的问题。您说您想要提示来自服务的凭据。服务不应显示UI,在现代版本的Windows中,服务根本无法显示UI。您的设计存在缺陷,需要重新考虑。
答案 4 :(得分:0)
也许为你提供帮助已经太晚了。但它可能对其他人有所帮助。如果您使用CreateProcessWithLogonW
函数并且使用的是Default
桌面,请将lpDesktop
保留为NULL。
如果lpDesktop
不是空,则必须在桌面和winstation的LookupAccountNamean
ACE
)作为DACL
以下是为桌面添加ACE
时必须执行的步骤:
OpenDesktop
获取桌面句柄,使用正确的dwDesiredAccess Security Descriptor
GetSecurityInfo
和DACL_SECURITY_INFORMATION
作为securityinfo DACL
Security Descriptor
AddAccessAllowedAce
DACL
设置为桌面句柄现在重复winsta0
winstation
先生documantary中的Furious先生帮助我解决了这个问题。