Comment exécuter une application qui nécessite des droits d'administrateur à partir d'un qui ne les a pas [fermé]

j'ai été bloqué sur ce pendant quelques heures jusqu'à ce que j'ai enfin réussi à le faire. Il y a déjà des liens qui m'ont indiqué la bonne direction:

  • Est-il possible pour l'exécutable de demander des droits d'Administrateur? (Windows 7)
  • erreur de CreateProcess=740, l'opération demandée nécessite une élévation

mais j'ai pensé que simple aperçu le problème pourrait aider quelqu'un :).

24
demandé sur Community 2012-07-20 23:55:02

1 réponses

vrai problème: (de Wikipedia: http://en.wikipedia.org/wiki/User_Account_Control )

un exécutable qui est marqué" requiredadministrator " dans son manifeste ne peut pas être démarré à partir d'un processus Non élevé en utilisant CreateProcess(). Au lieu de cela, ERROR_ELEVATION_REQUIRED sera retourné. ShellExecute() ou ShellExecuteEx () doivent être utilisés à la place.

(BTW, ERROR_ELEVATION_REQUIRED error == 740)

Solution: (même site)

dans une application Win32 native, le même verbe" runas " peut être ajouté à un appel ShellExecute() ou ShellExecuteEx ().

ShellExecute(hwnd, "runas", "C:\Windows\Notepad.exe", 0, 0, SW_SHOWNORMAL);

Cela peut être aussi utile: (source: http://mark.koli.ch/2009/12/uac-prompt-from-java-createprocess-error740-the-requested-operation-requires-elevation.html )

2 - Flux UAC de base

Ok, donc avant de creuser dedans, j'ai pensé qu'il pourrait être utile d'expliquer le flux de base d'une application consciente de UAC et comment tout s'emboîte ensemble. Normalement, votre application fonctionne comme un utilisateur non privilégié. Mais, parfois, il faut que ce soit un administrateur (pour faire quoi que ce soit). Donc, voici l'idée de base, en pseudo code:

int main (int argc, char **argv) {

  HRESULT operation = tryToDoSomethingPrivileged();

  if (operation == ACCESS_DENIED && !alreadyElevated) {

    // Spawn a copy of ourselves, via ShellExecuteEx().
    // The "runas" verb is important because that's what
    // internally triggers Windows to open up a UAC prompt.
    HANDLE child = ShellExecuteEx(argc, argv, "runas");

    if (child) {
      // User accepted UAC prompt (gave permission).
      // The unprivileged parent should wait for
      // the privileged child to finish.
      WaitForSingleObject(child, INFINITE);
      CloseHandle(pid);
    }
    else {
      // User rejected UAC prompt.
      return FAILURE;
    }

    return SUCCESS;

  }  

  return SUCCESS;

}

enfin, c'est comme ça que je l'ai fait:

if(0 == CreateProcess(argv[2], params, NULL, NULL, false, 0, NULL, NULL, &si, &pi)) {
        //runas word is a hack to require UAC elevation
        ShellExecute(NULL, "runas", argv[2], params, NULL, SW_SHOWNORMAL);
}

Et juste par souci d'exhaustivité - même- MSDN liens vers ShellExecute et CreateProcess:

http://msdn.microsoft.com/en-us/library/bb762153%28v=vs.85%29.aspx

http://msdn.microsoft.com/en-us/library/ms682425%28VS.85%29.aspx

28
répondu Samuel 2012-07-20 19:55:02