Как запросить повышение с помощью глагола «запустить как» в Java - PullRequest
0 голосов
/ 11 мая 2018

Я пытался запустить это Java-приложение:

public class Run_Process {

    public static void main(String[] args) {
        String myCommandIp = "netsh interface ip set address name=\"Ethernet\" static 192.168.0.4 255.255.255.0 192.168.0.1 1";
        String myCommand2Dns = "netsh interface ipv4 add dnsserver \"Ethernet\" address=192.168.0.1 index=1";

        runCommand(myCommandIp);
        runCommand(myCommand2Dns);
    }

    static void runCommand(String command) {
        try {
            new ProcessBuilder(command.split(" ")).redirectError(ProcessBuilder.Redirect.INHERIT)
                    .redirectOutput(ProcessBuilder.Redirect.INHERIT).start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

, но получаю:

The requested operation requires elevation(Run as administrator)

Как снова запустить мое приложение, запрашивая повышение с глаголом «запустить как»?Вот как я это сделал в Python.Однако мне нужна помощь, чтобы сделать это на Java.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import ctypes, sys, subprocess

def is_admin():
    try:
        return ctypes.windll.shell32.IsUserAnAdmin()
    except:
        return False

if is_admin():
    subprocess.call(['wmic', '/output:usracc.txt', 'useraccount', 'list', 'full', '/format:csv'])
else:
    # Re-run the program with admin rights
    ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, __file__, None, 1)

Об этом много раз спрашивали, но мне нужен конкретный пример для моего случая, потому что я нуб.

Iобъясню, почему это не дубликат связанного вопроса.Использование ярлыка не вариант.Я должен предположить, что пользователь не знает, как создать ярлык.Решения JNA и wizmo не объясняются. Здесь здесь написано, что:

Итак, в мире Java вам просто нужно делать именно то, что должны делать все остальные: снова запускать ваше приложение, запрашивая повышение прав.Существует несколько способов запуска с повышенными правами, глагол «запустить как», вероятно, самый простой.

Итак, я прошу помощи, как использовать решение с глаголом «запустить как» и ShellExecute в Java.

1 Ответ

0 голосов
/ 12 мая 2018

Хорошо, это ответ на мой вопрос. Я оставлю это здесь для дальнейшего использования. Во-первых, я скачал JNA с здесь . Запустите их с java -jar jna.jar и импортируйте в мой проект Eclipse.

Это откроет cmd от имени администратора, если вы ответите yes в UAC, а затем запустит команду netsh. Это runas, который запускает UAC. Вы можете использовать open для запуска cmd как обычный пользователь.

Этот SO-ответ мне очень помог с jna, этот тоже с передачей аргументов в ShellExecute. Здесь вы можете прочитать, что /S и /C делают.

import com.sun.jna.*;
import com.sun.jna.platform.win32.ShellAPI;
import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.win32.*;

public class Main {
    public interface Shell32 extends ShellAPI, StdCallLibrary {
        Shell32 INSTANCE = (Shell32)Native.loadLibrary("shell32", Shell32.class);

        WinDef.HINSTANCE ShellExecuteA(WinDef.HWND hwnd,
                                      String lpOperation,
                                      String lpFile,
                                      String lpParameters,
                                      String lpDirectory,
                                      int nShowCmd);
    }

    public static void main(String[] args) {
        WinDef.HWND h = null;
        Shell32.INSTANCE.ShellExecuteA(h, "runas", "cmd.exe", "/S /C \"netsh interface ip set address name=\"Wi-Fi\" static 192.168.88.189 255.255.255.0 192.168.88.1 1\"", null, 1);
...