【问题标题】:CreateProcessAsUser() not workingCreateProcessAsUser() 不工作
【发布时间】:2013-09-05 06:14:00
【问题描述】:

我正在尝试使用我的服务启动 GUI 应用程序。我在 VS2012 上开发了该服务并在 Windows 7 上运行。但是 CreateProcessAsUser 函数即使返回成功也不会启动应用程序。以下是我的代码:

PHANDLE hToken = NULL;
WTSQueryUserToken (WTSGetActiveConsoleSessionId (), hToken) ;

if( !CreateProcessAsUser( hToken,
    NULL,   // No module name (use command line)
    pPath,          // Command line
    NULL,           // Process handle not inheritable
    NULL,           // Thread handle not inheritable
    FALSE,          // Set handle inheritance to FALSE
    0,              // No creation flags
    NULL,           // Use parent's environment block
    NULL,           // Use parent's starting directory 
    &si,            // Pointer to STARTUPINFO structure
    &pi )           // Pointer to PROCESS_INFORMATION structure
 )

可能是什么问题?

谢谢, 公里。

【问题讨论】:

  • 建议你扩展 sn-p 以显示 hToken、pPath、si 和 pi 是什么
  • 当某个系统功能失败时,您应该使用GetLastError 找出问题所在。请参阅here for lists of error codes,了解它们的含义。
  • MSDN 说“注意函数在进程完成初始化之前返回。如果找不到所需的DLL或初始化失败,则终止进程”,这可能值得考虑。
  • WTSQueryUserToken 是否成功并为您提供具有所需访问权限的有效令牌?
  • 你初始化结构了吗? ZeroMemory(&si, sizeof(si));ZeroMemory(&pi, sizeof(pi));

标签: c++ windows winapi


【解决方案1】:

WTSQueryUserToken() 检索用户令牌后,调用DuplicateTokenEx() 将其转换为主令牌,并将该令牌传递给CreateProcessAsUser()。您还需要通过STARTUPINFO 结构指定“winsta0\default”(使用:"winsta0\\default")桌面。您还应该使用相同的令牌调用CreateEnvironmentBlock(),并将该环境也传递给CreateProcessAsUser()

【讨论】:

  • WTSQueryUserToken 已经返回主令牌。不需要复制它
【解决方案2】:

没有足够的信息来确定我的答案,但是当结构没有正确初始化时,这种错误经常发生。

PHANDLE hToken = NULL;
WTSQueryUserToken (WTSGetActiveConsoleSessionId (), hToken) ;

//be sure that the handle is correct ! (can be the issue)
if (!hToken) printf("Token error.\n");

//init here !
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));

if( !CreateProcessAsUser( hToken,
    NULL,   // No module name (use command line)
    pPath,          // Command line
    NULL,           // Process handle not inheritable
    NULL,           // Thread handle not inheritable
    FALSE,          // Set handle inheritance to FALSE
    0,              // No creation flags
    NULL,           // Use parent's environment block
    NULL,           // Use parent's starting directory 
    &si,            // Pointer to STARTUPINFO structure
    &pi )           // Pointer to PROCESS_INFORMATION structure
 )

【讨论】:

    【解决方案3】:

    我在 Windows 7 中使用 WTSQueryUserToken 时遇到了类似的问题,但相同的功能在 Windows 10 中也可以使用。

    所以我取了explorer.exe 令牌,称为DuplicateTokenEx 函数。 设置startupinfo结构对应的值

    si.lpDesktop = "winsta0\\default";
    si.wShowWindow = SW_SHOWNORMAL;
    si.dwFlags = STARTF_USESHOWWINDOW;
    

    并打电话给createprocessasuser

    【讨论】:

      猜你喜欢
      • 2023-03-07
      • 2011-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 2020-07-26
      • 2010-12-01
      相关资源
      最近更新 更多