9

Java ProcessBuilderクラスを介してタスクスケジューラで新しいタスクを作成しようとすると、WindowsVistaでアクセス拒否エラーが発生します。XPでは問題なく動作します。

「管理者として実行」オプションを使用すると、Vistaでも実行されます。

ただし、これは、ユーザーがこれについて知らない可能性があるために必要な追加の手順です。ユーザーがアプリアイコンをダブルクリックするだけで失敗し、アクセスが拒否されます。私の質問は、起動直後にJavaアプリに管理者権限を強制的に再利用させるにはどうすればよいですか?

4

5 に答える 5

23

launch4j を使用して Java アプリケーションを .exe にラップすることを検討したことがありますか? これにより、実行可能ファイルの「実行レベル」を指定できるマニフェスト ファイルを埋め込むことができます。つまり、実行中のアプリケーションに付与する必要がある特権を制御し、ユーザーが手動で実行する必要なく、OS に「管理者として実行」するよう効果的に伝えます。

例えば...

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>  

モードの詳細については、 http://msdn.microsoft.com/en-us/library/bb756929.aspxおよび launch4j Web サイトを参照してください。

于 2010-02-23T14:34:58.833 に答える
3

プログラムでそれを行うことができるかどうかはわかりません。アプリのインストーラーがある場合は、レジストリ キーを追加して、管理者として強制的に実行できます。

パス: HKEY_CURRENT_USER\Software\Microsoft\Windows NT\Currentversion\Appcompatflags\layers

キー: << exe へのフルパス >>

値: RUNASADMIN

タイプ: REG_SZ

于 2008-11-03T14:50:03.000 に答える
0

私はまだ最善の解決策を見つけていません。しかし、「James Van Huis」と比較して別の回避策があります。代わりに RUNASINVOKE を使用して、アプリを実行するたびに許可/拒否のプロンプトを表示する必要がないようにします。

注:私が解決しようとしているのは、常に管理者である必要があります

于 2010-02-13T06:39:57.537 に答える
0

launch4j Gradle プラグインの使用

特に既に Gradle を使用している場合は、launch4j プラグインを適用してこれを修正するのは簡単です。

freecouch' answerのように、ファイル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> 

次に、Gradle プラグインを適用します。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"
}

または、Kotlin Gradle DSL を使用している場合は、次のようにします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"
}
于 2018-04-04T06:47:42.403 に答える