Question

Lorsque j'essaie de créer une nouvelle tâche dans le planificateur de tâches via la classe Java ProcessBuilder, j'obtiens une erreur d'accès refusé de Windows Vista. Sous XP, cela fonctionne très bien.

Quand j'utilise le " Exécuter en tant qu'administrateur " option, il fonctionne aussi sur Vista ..

Cependant, il s'agit d'une étape supplémentaire requise, que les utilisateurs pourraient ignorer. Lorsque l'utilisateur clique deux fois sur l'icône de l'application, son accès échoue et l'accès est refusé. Ma question est la suivante: comment puis-je forcer une application Java à récupérer les privilèges d’administrateur juste après le démarrage?

Était-ce utile?

La solution

Je ne suis pas sûr que vous puissiez le faire par programme. Si vous avez un programme d'installation pour votre application, vous pouvez ajouter la clé de registre pour forcer l'exécution en tant qu'administrateur:

  

Chemin:   HKEY_CURRENT_USER \ Software \ Microsoft \ Windows   NT \ Currentversion \ Appcompatflags \ layers

     

Clé: < < Chemin complet vers exe & Gt; & Gt;

     

Valeur: RUNASADMIN

     

Type: REG_SZ

Autres conseils

Avez-vous envisagé d'encapsuler votre application Java dans un fichier .exe à l'aide de launch4j? En faisant cela, vous pouvez incorporer un fichier manifeste qui vous permet de spécifier le & "Niveau d'exécution &"; pour votre exécutable. En d'autres termes, vous contrôlez les privilèges qui doivent être accordés à votre application en cours d'exécution en indiquant le système d'exploitation à & "Exécuter en tant qu'administrateur &"; sans demander à l'utilisateur de le faire manuellement.

Par exemple ...

build.xml:

<target name="wrapMyApp" depends="myapp.jar">
        <launch4j configFile="myappConfig.xml" />
</target>

myappConfig.xml:

<launch4jConfig>
  <dontWrapJar>false</dontWrapJar>
  <headerType>gui</headerType>
  <jar>bin\myapp.jar</jar>
  <outfile>bin\myapp.exe</outfile>
  <priority>normal</priority>
  <downloadUrl>http://java.com/download</downloadUrl>
  <customProcName>true</customProcName>
  <stayAlive>false</stayAlive>
  <manifest>myapp.manifest</manifest>
  <jre>
    <path></path>
    <minVersion>1.5.0</minVersion>
    <maxVersion></maxVersion>
    <jdkPreference>preferJre</jdkPreference>
  </jre>
</launch4jConfig>

myapp.manifest:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
        <security>
            <requestedPrivileges>
            <requestedExecutionLevel level="highestAvailable"
                uiAccess="False" />
        </requestedPrivileges>
    </security>
    </trustInfo>
</assembly>  

Voir http://msdn.microsoft.com/en-us/library /bb756929.aspx et le site Web launch4j pour plus de détails sur le mode.

Bien que la réponse de FreeCouch soit bonne, mais j’ai fait face à un problème et j’ai pensé le mettre ici pour que les autres puissent en bénéficier facilement.

Pour obtenir l'autorisation de l'administrateur en Java, la solution consiste à envelopper le fichier * .jar dans un fichier * .exe avec un programme comme Launch4J et un manifeste de liaison avec celui-ci.

Pour créer un fichier manifeste, ouvrez un éditeur de texte tel que le Bloc-notes, collez-y ces lignes et enregistrez-le avec le nom du fichier avec son extension, par exemple: myApplication.exe.manifest

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
     <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
         <security>
             <requestedPrivileges>
                 <requestedExecutionLevel level="highestAvailable" uiAccess="False" />
             </requestedPrivileges>
         </security>
     </trustInfo>
</assembly>  

Dans Launch4J, sur l'onglet Basic ajoutez ce fichier dans l'option Wrapper Manifest.

Je n'ai pas encore trouvé la meilleure solution. Mais j’ai un autre moyen de contourner le problème en comparant à & "James Van Huis &"; Utilisez plutôt RUNASINVOKE pour ne pas avoir à voir l'invite Autoriser / Refuser chaque fois que vous exécutez l'application.

Remarque: vous devez toujours être administrateur, c'est ce que j'essaie de résoudre

Utilisation du plugin launch4j Gradle

Surtout lorsque vous utilisez déjà Gradle, il est facile d'appliquer le plug-in launch4j pour résoudre ce problème. .

Comme dans la réponse freecouch ', créez un fichier myapp.manifest avec

.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
        <security>
            <requestedPrivileges>
            <requestedExecutionLevel level="highestAvailable"
                uiAccess="False" />
        </requestedPrivileges>
    </security>
    </trustInfo>
</assembly> 

puis appliquez le plugin Gradle en ajoutant à votre build.gradle

plugins {
  id 'java'
  id 'edu.sc.seis.launch4j' version '2.4.3'
}

launch4j {
    mainClassName = 'com.mypackage.MainClass'
    icon = "$projectDir/icons/icon.ico"
    manifest = "$projectDir/myapp.manifest"
}

ou, si vous utilisez Kotlin Gradle DSL, à votre build.gradle.kts:

plugins {
    application
    kotlin("jvm") version "1.2.31"
    java
    id("edu.sc.seis.launch4j") version "2.4.3"
}

launch4j {
    mainClassName = "com.mypackage.MainKt"
    icon = "$projectDir/icons/icon.ico"
    manifest = "$projectDir/myapp.manifest"
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top