C++ CreateProcessWithLogonW:无法启动进程
嗨,我对编程一无所知。请有人帮帮我 我正在尝试从一个服务启动一个进程。 我需要通过提示用户输入管理员凭据来启动新流程 我试图使用C++ CreateProcessWithLogonW:无法启动进程,c++,windows,winapi,windows-7,windows-services,C++,Windows,Winapi,Windows 7,Windows Services,嗨,我对编程一无所知。请有人帮帮我 我正在尝试从一个服务启动一个进程。 我需要通过提示用户输入管理员凭据来启动新流程 我试图使用CreateProcessWithLogonW() 我是否使用了正确的函数。 我尝试将输入用户名、密码和域设置为localhost。我为需要启动的.exe文件提供了完整路径 这是一段代码 CreateProcessWithLogonW(L"Administrator", L"localhost",
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";
但这一过程从未开始。你们能告诉我我做错了什么吗。
我需要做些什么来提示用户输入管理员的凭据,而不是硬编码 一个问题是将字符串文本作为命令行参数传递,因为该参数必须是可修改的。从与命令行参数相关的: 函数可以修改此字符串的内容。因此,此参数不能是指向只读内存(例如常量变量或文字字符串)的指针。如果此参数是常量字符串,则函数可能会导致访问冲突 你还需要避开反斜杠。改为:
WCHAR cmdLine[] = L"c:\\myupdates\\myapp.exe"; /* 'cmdLine' is a
copy of the string
literal. */
并改为通过cmdLine
在任何WINAPI函数失败后检查,因为它将通知您失败的原因。一个问题是将字符串文本作为命令行参数传递,因为该参数必须是可修改的。从与命令行参数相关的: 函数可以修改此字符串的内容。因此,此参数不能是指向只读内存(例如常量变量或文字字符串)的指针。如果此参数是常量字符串,则函数可能会导致访问冲突 你还需要避开反斜杠。改为:
WCHAR cmdLine[] = L"c:\\myupdates\\myapp.exe"; /* 'cmdLine' is a
copy of the string
literal. */
并改为通过cmdLine
在任何WINAPI函数失败后进行检查,因为它会通知您失败的原因。您可能还需要正确地转义程序字符串:
L"c:\myupdates\myapp.exe"
应至少:
L"c:\\myupdates\\myapp.exe"
坦率地说,这段代码有很多错误,从SI的不正确设置到传递给API本身的参数。我建议您阅读更多内容。您可能还希望正确转义程序字符串:
L"c:\myupdates\myapp.exe"
应至少:
L"c:\\myupdates\\myapp.exe"
坦率地说,这段代码有很多错误,从SI的不正确设置到传递给API本身的参数。我建议您多读一读。CreateProcess*函数都不会有任何提示。它们是低级API,对GUI一无所知
如果希望提示用户,请使用
ShellExecuteEx
和runas
命令。Windows将首先请求提升权限,然后提示输入凭据。所有CreateProcess*函数都不会进行任何提示。它们是低级API,对GUI一无所知
如果希望提示用户,请使用
ShellExecuteEx
和runas
命令。Windows将首先请求提升权限,然后提示输入凭据。访问冲突取决于lpCommandLine参数。这意味着一个可编辑内存,LPWSTR和API函数确实修改了缓冲区。但是您传递一个指向不可修改内存的指针
但还有一个更根本的问题。您说要提示从服务中输入凭据。服务不应该显示UI,在现代版本的Windows中,服务根本不能显示UI。你的设计有缺陷,需要重新考虑 访问冲突取决于lpCommandLine参数。这意味着一个可编辑内存,LPWSTR和API函数确实修改了缓冲区。但是您传递一个指向不可修改内存的指针
但还有一个更根本的问题。您说要提示从服务中输入凭据。服务不应该显示UI,在现代版本的Windows中,服务根本不能显示UI。你的设计有缺陷,需要重新考虑 也许现在帮你已经太晚了。不过,这可能对其他人有所帮助。如果您使用
CreateProcessWithLogonW
功能并且使用Default
桌面,只需将lpDesktop
保持为空即可
如果lpDesktop
不为空,则必须在桌面和winstation的DACL
中以ACE
的形式输入用户的sid(使用LookupAccountNamean
)
下面是为桌面添加ACE
所需的步骤:
OpenDesktop
获取桌面句柄,使用正确的dwDesiredAccessGetSecurityInfo
和DACL\u Security\u信息作为securityinfo获取Security描述符
安全描述符中获取DACL
AddAccessAllowedAce
DACL
设置为桌面句柄winsta0
winstation重复这些步骤
《愤怒先生》杂志的社论帮助我解决了这个问题。也许现在帮你已经太迟了。不过,这可能对其他人有所帮助。如果您使用
CreateProcessWithLogonW
功能并且使用Default
桌面,只需将lpDesktop
保持为空即可
如果lpDesktop
不为空,则必须在桌面和winstation的DACL
中以ACE
的形式输入用户的sid(使用LookupAccountNamean
)
下面是为桌面添加ACE
所需的步骤:
OpenDesktop
获取桌面句柄,使用正确的dwDesiredAccessGetSecurityInfo
和DACL\u Security\u信息作为securityinfo获取Security描述符
安全描述符中获取DACL
AddAccessAllowedAce