【问题标题】:Elevating process via ShellExecuteInfo - Infinite shells?通过 ShellExecuteInfo 提升过程 - 无限壳?
【发布时间】:2013-08-05 19:20:19
【问题描述】:

我关注this article 来提升一个进程,但是在我下面的代码中(目前几乎是一个副本),在调试时,我会创建无限数量的 shell。指示它发生的行。

我查看了 MSDN 文章 here 但这并没有给我太多的见解。 请指教我做错了什么?

我是 C++ 新手。

wchar_t szPath[MAX_PATH];
if (GetModuleFileName(NULL, szPath, ARRAYSIZE(szPath)))
{
    // Launch itself as admin
    SHELLEXECUTEINFO sei = { sizeof(sei) };
    sei.lpVerb = L"runas";
    sei.lpFile = szPath;
    sei.hwnd = NULL;
    sei.nShow = SW_NORMAL;
    if (!ShellExecuteEx(&sei)) //get infinite shells here
    {
        DWORD dwError = GetLastError();
        if (dwError == ERROR_CANCELLED)
        {
            // The user refused to allow privileges elevation.
            std::cout << "User did not allow elevation" << std::endl;
        }
    }
    else
    {
        //other lines of code omitted.
    }       
}   

【问题讨论】:

  • 看起来你启动了一个自己的副本,它启动了一个自身的副本,它启动了......

标签: c++ visual-c++ elevation elevated-privileges shellexecuteex


【解决方案1】:

Roger 是对的:您正在启动一个程序副本,该程序启动该程序的副本等等 - 缺少的是您正在链接的文章中的 IsAppRunningAsAdminMode() 函数:您应该先调用它,然后再调用它仅当返回 false 时才尝试启动程序的新提升副本 - 即仅当当前执行程序未提升时。

【讨论】:

  • 好的,谢谢。我接下来尝试了以下操作,但是“fIsRunAsAdmin”被标记为未定义? IsAppRunningAsAdminMode(); if (fIsRunAsAdmin = false){ //elevate process } else { //do nothing since process already elevated }
  • @NickProwse:您是否将文章中的函数本身复制到您的源代码中?
  • @NickProwse: fIsRunAsAdmin = falsefalse 分配给fIsRunAsAdmin - 你想要的是fIsRunAdAdmin == false - 或者更好的是!fIsRunAsAdmin
  • 是的,我从文章中复制了该功能。好的,我现在将其更改为 fIsRunAdAdmin == false 我仍然得到 fIsRunAsAdmin 被标记为未定义?
  • 你定义了那个变量吗?您的代码中应该有类似 bool fIsRunAdAdmin = IsAppRunningAsAdminMode(); 的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-17
  • 2011-03-12
  • 2014-04-26
  • 2019-09-24
  • 1970-01-01
  • 1970-01-01
  • 2015-10-02
相关资源
最近更新 更多