0

나는 프로세스를 높이기 위해 this article을 따라 갔지만 디버깅 할 때는 아래 코드를 사용하여 무한한 수의 쉘을 생성합니다. 발생하는 행이 표시됩니다.ShellExecuteInfo를 통한 상승 과정 - 무한 껍질?

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. 
    }  
} 
+1

자신의 복사본을 시작한 것으로 보이는 복사본이 시작됩니다. –

답변

2

로저 권리 :이 프로그램 등 등의 사본을 시작하는 프로그램의 복사본을 실행하는 - 어떤없는 것은 당신이 연결되는 기사에서 IsAppRunningAsAdminMode() 기능입니다 : 당신이 먼저 전화해야 false를 반환하는 경우에만 - 즉 현재 실행 프로그램이 상승되지 않은 경우에만 프로그램의 새로운 상승 된 복사본을 시작하려고합니다.

+0

감사합니다. 나는 아래에서 다음을 시도했지만 "fIsRunAsAdmin"은 정의되지 않은 것으로 표시되어 있습니다 ?? \t 'IsAppRunningAsAdminMode(); \t 경우 (거짓 fIsRunAsAdmin =) { \t \t //이 상승 과정 \t} 다른 \t { \t \t // 이미 상승 과정 때문에 아무것도 할 \t}' –

+0

@NickProwse : 당신은에서 함수 자체를 복사 않았다 기사를 소스 코드에 추가 하시겠습니까? – MiMo

+1

@NickProwse :'fIsRunAsAdmin = false'는'fIsRunAsAdmin'에'false'를 할당합니다 - 당신이 원하는 것은'fIsRunAdAdmin == false' - 또는 더 나은'! fIsRunAsAdmin'입니다 – MiMo