2017-05-15 15 views
0

내 응용 프로그램이 표준 사용자로 실행됩니다. 때때로 관리자 권한이 필요한 레지스트리 키를 만들어야합니다. 사용자에게 관리자 권한을 요청하고 싶습니다.표준 사용자로부터 레지스트리 키를 변경하려면 프로세스를 시작해야합니까?

나는이 라인을 따라 뭔가 할 경우

GetNamedSecurityInfo 
AllocateAndInitializeSid 
SetEntriesInAcl 
SetNamedSecurityInfo (or RegSetKeySecurity) 

이 원인 Windows가 자동으로 권한 부여를 위해 사용자에게 메시지를 표시 대화 상자를 팝업해야을?

대신 레지스트리에 액세스하기 위해 프로세스를 시작해야합니까? 어떤 경우에 사용자에게 프로세스에 대한 관리자 권한을 얻으라는 메시지를 표시하려면 어떻게해야합니까?

나는 사용자 비밀번호를보고 싶지 않기 때문에 CredUIPromptForCredentials을 사용하지 않는 것을 선호합니다.

Access Control 설명서를 읽었습니다. 나무 숲이 보이지 않는 것 같습니다.

+0

나에게 정교했던 사람이 -1'eded? – Pierre

답변

2

작업을 수행하는 데 권한 상승이 필요한 API를 호출했기 때문에 Windows가 UAC 대화 상자를 표시하지 않습니다. API는 단순히 ERROR_ACCESS_DENIED와 함께 실패합니다.

  1. elevated COM object 구현 :

    당신은 기본적으로 세 가지 옵션이 있습니다.

  2. ShellExecute 사용자가 RunAs 동사와 명령 줄 매개 변수를 사용하여이 모드에 있음을 감지 할 수 있습니다.
  3. 요청시 시작할 수 있고 명명 된 파이프를 통해 통신 할 수있는 NT service을 만듭니다. 이 방법은 권장하지 않습니다.
+0

@Anders! 감사합니다. 큰 장애물이 없어집니다. 매우 도움이됩니다. COM 접근법은 실행 가능한 것처럼 보입니다. 단, 사용자에게 모든 권한 작업이 필요하다는 점을 제외하고는 부담이 될 수 있습니다. ShellExecuteEx를 살펴 보았습니다. SHELLEXECUTEINFO 구조에서 Admin-level을 요청할 위치를 볼 수 없습니다. 그게 매니 페스트에 있어야할까요? – Pierre

+0

'SHELLEXECUTEINFO'의 동사 문자열을''RunAs''로 설정하십시오. – Anders

+0

우수. 또한 다음 게시물에서 확인을 발견했습니다. http://stackoverflow.com/questions/11586139/how-to-run-application-which-requires-admin-rights-from-one-that-doesnt-have-th, http://stackoverflow.com/questions/8915744/is-it-possible-for-the-executable-to-ask-for-administrator-rights-windows-7. 휴스턴, 해결책이있어. – Pierre

0

여기, 내가 가지고 올 것을 @Anders '훌륭한 조언 덕분 :

// launch separate process for elevation to Admin 
void launchAsAdmin(void) 
{ SHELLEXECUTEINFO shelinfo; 
    char *err = NULL; 
    DWORD exitCode; 

    memset(&shelinfo, 0, sizeof(shelinfo)); 
    shelinfo.cbSize = sizeof(shelinfo); 
    shelinfo.hwnd = NULL; 
    shelinfo.fMask = SEE_MASK_NOCLOSEPROCESS; 
    shelinfo.lpVerb = "RunAs"; 
    shelinfo.lpFile = "notepad.exe"; 
    shelinfo.lpParameters = "C:\\Windows\\System32\\drivers\\etc\\hosts"; 
    shelinfo.nShow = SW_SHOW; 

    ShellExecuteEx(&shelinfo); 
    switch((int)shelinfo.hInstApp) 
    { case SE_ERR_FNF: 
      err = "File not found"; break; 
     case SE_ERR_PNF: 
      err = "Path not found"; break; 
     case SE_ERR_ACCESSDENIED: 
      err = "Access denied"; break; 
     case SE_ERR_OOM: 
      err = "Out of memory"; break; 
     case SE_ERR_DLLNOTFOUND: 
      err = "Dynamic-link library not found"; break; 
     case SE_ERR_SHARE: 
      err = "Cannot share an open file"; break; 
     case SE_ERR_ASSOCINCOMPLETE: 
      err = "File association information not complete"; break; 
     case SE_ERR_DDETIMEOUT: 
      err = "DDE operation timed out"; break; 
     case SE_ERR_DDEFAIL: 
      err = "DDE operation failed"; break; 
     case SE_ERR_DDEBUSY: 
      err = "DDE operation is busy"; break; 
     case SE_ERR_NOASSOC: 
      err = "File association not available"; break; 
    } 
    if((int)shelinfo.hInstApp <= 32) 
     return;  // failed 
    if(shelinfo.hProcess == 0) 
     return;  // nothing to monitor 

    // wait until the process has finished 
    time_t st = clock(); 
    do 
    { if(!GetExitCodeProcess(shelinfo.hProcess, &exitCode)) 
      break; 
     if(clock() - st > CLOCKS_PER_SEC * 5)  // max 5 seconds - give up 
      break; 
    } while(exitCode != STATUS_WAIT_0); // STILL_ACTIVE 
    CloseHandle(shelinfo.hProcess); 
} 

이 작동합니다. 내가 표준 사용자이고이 기능을 호출하는 프로그램을 실행하면 관리자 로그인 ID & 암호를 묻는 메시지가 표시되고 "HOSTS"시스템 파일을 변경하고 저장할 수 있습니다. (일반적으로이 파일은 표준 사용자의 출입을 제한합니다).