Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CreateProcessWithLogonW:无法启动进程_C++_Windows_Winapi_Windows 7_Windows Services - Fatal编程技术网

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
    获取桌面句柄,使用正确的dwDesiredAccess
  • 使用
    GetSecurityInfo
    DACL\u Security\u信息作为securityinfo获取
    Security描述符
  • 安全描述符中获取
    DACL
  • 使用用户sid的sid添加
    AddAccessAllowedAce
  • 将修改后的
    DACL
    设置为桌面句柄
  • 现在对
    winsta0
    winstation重复这些步骤


    《愤怒先生》杂志的社论帮助我解决了这个问题。

    也许现在帮你已经太迟了。不过,这可能对其他人有所帮助。如果您使用
    CreateProcessWithLogonW
    功能并且使用
    Default
    桌面,只需将
    lpDesktop
    保持为空即可

    如果
    lpDesktop
    不为空,则必须在桌面和winstation的
    DACL
    中以
    ACE
    的形式输入用户的sid(使用
    LookupAccountNamean

    下面是为桌面添加
    ACE
    所需的步骤:

  • 使用
    OpenDesktop
    获取桌面句柄,使用正确的dwDesiredAccess
  • 使用
    GetSecurityInfo
    DACL\u Security\u信息作为securityinfo获取
    Security描述符
  • 安全描述符中获取
    DACL
  • 使用您的sid添加
    AddAccessAllowedAce