5

状況

複数のプラットフォームで (Eclipse RCP ベースの) Java アプリケーションを実行しています。Windowsを除くすべてのプラットフォームでこれを理解しました。

インストーラー: 私のアプリケーション インストーラーは常に昇格モードで実行されるため、アプリケーションを にインストールできますC:\Program files\MyProduct。ユーザーの観点からは、インストーラーは管理者のみが実行でき、UAC は確認を求めます。これはうまくいきます。

通常の使用法: アプリケーションは通常のユーザーが起動できます。管理者権限は必要ありません。これはうまくいきます。

自動更新:自動更新機能も書き込みを行うため、管理者権限C:\Program Files\MyProductも必要です。そのため、アプリケーションは通常のアプリケーションとしても起動できますが、自動更新するには昇格したプロセスとして実行する必要があります。ユーザーの観点からは、自動更新するには「管理者として実行」する必要があります。

質問

Java プロセスが昇格モードであるかどうかを確認するための実行時チェックが必要です(つまり、「管理者として実行」されたかどうかを確認します)。

Windows のみのソリューションである可能性があることに注意してください。Java リフレクション API を使用して、実行時に Windows 固有または実装固有のクラスをチェックできます。

リサーチ

この質問は StackOverflow でのみ見つかりました: Java アプリケーションが Windows 管理者として実行されたかどうかを検出する

ただし、そのソリューションは、アクティブなユーザーが管理者グループのメンバーであるかどうかを返します。ユーザーは、昇格されていないモードでアプリケーションを起動している可能性があります。これを確認しました。

ノート

Eclipse RCP アプリケーションが、管理者権限を持っていない場合、ユーザー ディレクトリに更新を自動的にインストールすることは知っていますが、そのケースをブロックしたいと考えています。

ユーザー固有の構成を許可したいのですが (問題なく動作します)、ユーザー固有の更新を許可すると、アンインストール後に混乱が生じます。

4

2 に答える 2

3

JNAWin32 IsUserAnAdmin 関数の使用:

import com.sun.jna.LastErrorException;
import com.sun.jna.Native;
import com.sun.jna.Platform;
import com.sun.jna.win32.StdCallLibrary;

public class WindowsAdminUtil {

   public interface Shell32 extends StdCallLibrary {

      boolean IsUserAnAdmin() throws LastErrorException;
   }
   public static final Shell32 INSTANCE =
           Platform.isWindows() ?
           (Shell32) Native.loadLibrary("shell32", Shell32.class) : null;

   public static boolean isUserWindowsAdmin() {
      return INSTANCE != null && INSTANCE.IsUserAnAdmin();
   }
}

MS ドキュメントによると、IsUserAnAdmin() は Windows の将来のバージョンには存在しない可能性があります。そのため、さらに優れた方法は、JNA を使用してCheckTokenMembership 関数を呼び出すことです。ただし、それを行うのはより複雑なので、上記のコードは私が今日使用しているものです。

于 2013-10-16T06:04:12.347 に答える
3

これは、EclipseLocationManagerがインストール ディレクトリに書き込むことができるかどうかを判断するために行うことです。

public static boolean canWrite(File installDir) {
    if (installDir.canWrite() == false)
        return false;

    if (!installDir.isDirectory())
        return false;

    File fileTest = null;
    try {
        // we use the .dll suffix to properly test on Vista virtual directories
        // on Vista you are not allowed to write executable files on virtual directories like "Program Files"
        fileTest = File.createTempFile("writtableArea", ".dll", installDir);
    } catch (IOException e) {
        //If an exception occured while trying to create the file, it means that it is not writable
        return false;
    } finally {
        if (fileTest != null)
            fileTest.delete();
    }
    return true;
}

dll を作成しようとする試みに注意してください

于 2013-09-05T10:15:52.260 に答える