7
votes

Comment puis-je demander à l'utilisateur des autorisations élevées au moment de l'exécution?

Certaines applications, commencées par un utilisateur régulier demanderont des autorisations élevées si nécessaire (par exemple, un gestionnaire de fichiers doit écrire un tel dossier), puis continuer avec l'opération.

Comment puis-je reproduire ce comportement?


0 commentaires

4 Réponses :


3
votes

voir Cette question sur les privilèges élevant uniquement lorsque cela est requis en C # et Cet article sur le contrôle de compte d'utilisateur

Pour résumer, il faut lancer un nouveau processus avec des autorisations élevées. Le niveau d'élévation ne peut pas être changé au moment de l'exécution. Le lancement avec des autorisations élevées est effectué soit via WinapI ou incorporer un manifeste correct dans l'exécutable.


0 commentaires

2
votes

En bref: Créez deux fichiers exécutables pour Windows. L'exécutable régulier et un fichier exe travailleur que vous utilisez pour effectuer des opérations "élevées" (en passant des options de ligne de commande).

au deuxième fichier EXE Vous ajoutez un fichier manifeste d'application avec un noeud.

Lors du lancement de l'application de travailleur, assurez-vous d'utiliser la fonction QT qui enveloppe Shellexecute, pas CreateProcess comme CreateProcess ne parvient tout simplement pas à lancer des applications de requéresAdMinistrator, tandis que Shelllexecute (une fonction shell) peut effectuer l'invite d'élévation de l'UAC.

Il est également possible de le faire avec des contrôles ActiveX, mais comme vous ciblez QT qui semble moins approprié.


0 commentaires

2
votes

Vous pouvez également lancer un objet COM dans un mode élevé. Voir cette Article MSDN pour plus d'informations.


0 commentaires

4
votes

Comme l'a souligné Tamá, vous devez lancer un nouveau processus avec des droits élevés. J'ai beaucoup cherché dans le passé, mais je n'ai trouvé aucun moyen d'élever les droits du processus en cours.

permet de dire que votre application principale est app1.exe, puis vous appelez un processus secondaire app2.exe qui nécessite des droits élevés. p>


a. Vous pouvez intégrer un manifeste dans votre App2.exe, mais le moyen plus simple est de créer un fichier manifeste [un fichier texte] nommé app2.exe.manifest avec le contenu suivant et mettez-le dans le même répertoire que App2.exe. Fort > Noter: !! Assez étrangement, si le nom de votre application n'est pas app2.exe mais app2_install.exe ou app2_setup.exe (c.-à-d. Si le nom de l'application contient "Install" ou "SETUP") Une boîte de dialogue UAC apparaîtra automatiquement dans Windows Vista / Windows 7 et demandera des droits élevés, même s'il n'y a pas de fichier manifeste !! Il s'agit d'un échantillon du fichier manifeste: p> xxx pré>


b. Vous pouvez utiliser un code comme ci-dessous sur App1.exe pour lancer l'app2.exe strong> p> xxx pré>

... et enfin, il s'agit du code de la Win32 Fonction Genwin32Shelexecute () J'ai créé pour lancer un processus ou ouvrir un document lors de l'utilisation de QT sur une Win32 O / S: P>

en-tête: PRE> P>

// Execute/Open the specified Application/Document with the given command
// line Parameters
// (if WaitToFinish == true, wait for the spawn process to finish)
//
// Verb parameter values:
// ""           The degault verb for the associated AppFullPath
// "edit"       Launches an editor and opens the document for editing.
// "find"       Initiates a search starting from the specified directory.
// "open"       Launches an application. If this file is not an executable file, its associated application is launched.
// "print"      Prints the document file.
// "properties" Displays the object's properties.
//
// Ret: 0 = success
//     <0 = error
#ifdef Q_OS_WIN
int genWin32ShellExecute(QString AppFullPath,
                         QString Verb,
                         QString Params,
                         bool ShowAppWindow,
                         bool WaitToFinish)
{
    int Result = 0;

    // Setup the required structure
    SHELLEXECUTEINFO ShExecInfo;
    memset(&ShExecInfo, 0, sizeof(SHELLEXECUTEINFO));
    ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
    ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
    ShExecInfo.hwnd = NULL;
    ShExecInfo.lpVerb = NULL;
    if (Verb.length() > 0)
        ShExecInfo.lpVerb = reinterpret_cast<const WCHAR *>(Verb.utf16());
    ShExecInfo.lpFile = NULL;
    if (AppFullPath.length() > 0)
        ShExecInfo.lpFile = reinterpret_cast<const WCHAR *>(AppFullPath.utf16());
    ShExecInfo.lpParameters = NULL;
    if (Params.length() > 0)
        ShExecInfo.lpParameters = reinterpret_cast<const WCHAR *>(Params.utf16());
    ShExecInfo.lpDirectory = NULL;
    ShExecInfo.nShow = (ShowAppWindow ? SW_SHOW : SW_HIDE);
    ShExecInfo.hInstApp = NULL;

    // Spawn the process
    if (ShellExecuteEx(&ShExecInfo) == FALSE)
    {
        Result = -1; // Failed to execute process
    } else if (WaitToFinish)
    {
        WaitForSingleObject(ShExecInfo.hProcess, INFINITE);
    }

    return Result;
}
#endif


3 commentaires

C'était en fait moi qui l'a souligné après mes recherches: p. Merci pour la réponse détaillée. Si le nom exécutable contient également la chaîne "mise à jour", elle déclenchera également l'UAC.


J'ai édité ma réponse et mettez votre nom dans les crédits :-) Je dois vous remercier de demander et de me donner le motif de publier ce code de code. Je me souviens que j'ai passé au moins 1-2 jours lorsque j'avais besoin de ce code parce qu'il n'y avait aucune question correspondante.


Merci que ce n'était pas nécessaire :). J'apprécie vraiment que vous avez pris le temps écrit cette réponse détaillée, même si la question avait déjà une réponse acceptée.