Windows Vista上のJavaアプリの管理者権限をリクエストする
-
06-07-2019 - |
質問
Java ProcessBuilderクラスを介してタスクスケジューラで新しいタスクを作成しようとすると、Windows Vistaでアクセス拒否エラーが発生します。 XPでは問題なく動作します。
<!> quot;を使用して管理者として実行<!> quot;オプションはVistaでも実行されます。
ただし、これは追加の手順であり、ユーザーはこのことを知らない可能性があります。ユーザーがアプリのアイコンをダブルクリックすると、アクセスが拒否されて失敗します。私の質問は、起動直後にJavaアプリに管理者権限を強制的に強制するにはどうすればよいですか?
解決
プログラムで実行できるかどうかわかりません。アプリのインストーラーがある場合は、管理者として強制的に実行するレジストリキーを追加できます。
パス: HKEY_CURRENT_USER \ Software \ Microsoft \ Windows NT \ Currentversion \ Appcompatflags \ layers
キー:<!> lt; <!> lt; exeへの絶対パス<!> gt; <!> gt;
値:RUNASADMIN
タイプ:REG_SZ
他のヒント
launch4jを使用してJavaアプリケーションを.exeでラップすることを検討しましたか?これにより、<!> quot;実行レベル<!> quot;を指定できるマニフェストファイルを埋め込むことができます。実行可能ファイル用。つまり、実行中のアプリケーションに付与する特権を制御して、OSに<!> quot; Run as adminstrator <!> quot;を効果的に伝えます。ユーザーが手動で行う必要はありません。
たとえば...
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サイト。
FreeCouchの答えは良いのですが、私はいくつかの問題に直面し、次に他の人が簡単に利益を得ることができるようにここに置くことを考えました。
Javaで管理者権限を取得するための解決策は、Launch4Jなどのプログラムで* .exe内に* .jarをラップし、マニフェストをバインドすることです。
マニフェストファイルを作成するには、メモ帳などのテキストエディターを開き、これらの行を貼り付けて、ファイル名と拡張子とともに保存します。例: 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>
Launch4JのBasic
タブで、このファイルをラッパーマニフェストオプションに追加します。
最善の解決策はまだ見つかりません。しかし、私は<!> quot; James Van Huis <!> quot;と比較して、別の回避策があります。代わりにRUNASINVOKEを使用して、アプリを実行するたびに[許可/拒否]プロンプトを表示する必要がないようにします。
注:私が解決しようとしていることは、常に管理者でなければなりません
launch4j Gradleプラグインの使用
特に既にGradleを使用している場合、 launch4jプラグインを適用して簡単に修正できます。
freecouchの回答のように、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>
次に、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"
}