質問

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

に追加して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"
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top