GVKun编程网logo

通过UAC提升ProcessBuilder流程?

3

对于通过UAC提升ProcessBuilder流程?感兴趣的读者,本文将提供您所需要的所有信息,并且为您提供关于Bash命令不适用于ProcessBuilder、GWT+ProcessBuilder、

对于通过UAC提升ProcessBuilder流程?感兴趣的读者,本文将提供您所需要的所有信息,并且为您提供关于Bash 命令不适用于 ProcessBuilder、GWT + ProcessBuilder、Java ProcessBuilder process.destroy()不会杀死WinXP中的子进程、Java ProcessBuilder具有多个带空格的参数的宝贵知识。

本文目录一览:

通过UAC提升ProcessBuilder流程?

通过UAC提升ProcessBuilder流程?

我正在尝试运行一个外部可执行文件,但显然它需要提升。代码是从使用ProcessBuilder的示例(因此带有一个参数的数组)的示例修改而来的:

    public static void main(String[] args) throws IOException {        File demo = new File("C:\\xyzwsdemo");        if(!demo.exists()) demo.mkdirs();        String[] command = {"C:\\fakepath\\bsdiff4.3-win32\\bspatch.exe"};        ProcessBuilder pb = new ProcessBuilder( command );        Process process = pb.start();        InputStream is = process.getInputStream();        InputStreamReader isr = new InputStreamReader(is);        BufferedReader br = new BufferedReader(isr);        String line;        System.out.printf("Output of running %s is:\n", Arrays.toString(command));        while ((line = br.readLine()) != null) {            System.out.println(line);        }        try {            int exitValue = process.waitFor();            System.out.println("\n\nExit Value is " + exitValue);        } catch (InterruptedException e) {            e.printStackTrace();        }    }

运行时返回:

Exception in thread "main" java.io.IOException: Cannot run program "C:\Users\Gilliane\Downloads\bsdiff4.3-win32\bspatch.exe": CreateProcess error=740, The requested operation requires elevation

我已经进行了一些浏览,并且知道在C#中,您可以通过执行以下操作来请求提升(如从该线程中看到的):

startInfo.Verb = "runas";

但是,我在ProcessBuilder中看不到任何类似的东西。另一种方法是将Elevation
Tools安装在目标系统上,并使用ProcessBuilder调用“
elevate”提示。但是,我不想强​​迫使用我的程序的人也安装这些提升工具。

还有另一种方法吗?

答案1

小编典典

使用ProcessBuilder无法做到这一点,您需要调用Windows API。

我使用JNA通过类似于以下代码的代码来实现此目的:

Shell32X.java

import com.sun.jna.Native;import com.sun.jna.Pointer;import com.sun.jna.Structure;import com.sun.jna.WString;import com.sun.jna.platform.win32.Shell32;import com.sun.jna.platform.win32.WinDef.HINSTANCE;import com.sun.jna.platform.win32.WinDef.HWND;import com.sun.jna.platform.win32.WinNT.HANDLE;import com.sun.jna.platform.win32.WinReg.HKEY;import com.sun.jna.win32.W32APIOptions;public interface Shell32X extends Shell32{    Shell32X INSTANCE = (Shell32X)Native.loadLibrary("shell32", Shell32X.class, W32APIOptions.UNICODE_OPTIONS);    int SW_HIDE = 0;    int SW_MAXIMIZE = 3;    int SW_MINIMIZE = 6;    int SW_RESTORE = 9;    int SW_SHOW = 5;    int SW_SHOWDEFAULT = 10;    int SW_SHOWMAXIMIZED = 3;    int SW_SHOWMINIMIZED = 2;    int SW_SHOWMINNOACTIVE = 7;    int SW_SHOWNA = 8;    int SW_SHOWNOACTIVATE = 4;    int SW_SHOWNORMAL = 1;    /** File not found. */    int SE_ERR_FNF = 2;    /** Path not found. */    int SE_ERR_PNF = 3;    /** Access denied. */    int SE_ERR_ACCESSDENIED = 5;    /** Out of memory. */    int SE_ERR_OOM = 8;    /** DLL not found. */    int SE_ERR_DLLNOTFOUND = 32;    /** Cannot share an open file. */    int SE_ERR_SHARE = 26;    int SEE_MASK_NOCLOSEPROCESS = 0x00000040;    int ShellExecute(int i, String lpVerb, String lpFile, String lpParameters, String lpDirectory, int nShow);    boolean ShellExecuteEx(SHELLEXECUTEINFO lpExecInfo);    public static class SHELLEXECUTEINFO extends Structure    {        /*  DWORD     cbSize;  ULONG     fMask;  HWND      hwnd;  LPCTSTR   lpVerb;  LPCTSTR   lpFile;  LPCTSTR   lpParameters;  LPCTSTR   lpDirectory;  int       nShow;  HINSTANCE hInstApp;  LPVOID    lpIDList;  LPCTSTR   lpClass;  HKEY      hkeyClass;  DWORD     dwHotKey;  union {    HANDLE hIcon;    HANDLE hMonitor;  } DUMMYUNIONNAME;  HANDLE    hProcess;         */        public int cbSize = size();        public int fMask;        public HWND hwnd;        public WString lpVerb;        public WString lpFile;        public WString lpParameters;        public WString lpDirectory;        public int nShow;        public HINSTANCE hInstApp;        public Pointer lpIDList;        public WString lpClass;        public HKEY hKeyClass;        public int dwHotKey;        /*         * Actually:         * union {         *  HANDLE hIcon;         *  HANDLE hMonitor;         * } DUMMYUNIONNAME;         */        public HANDLE hMonitor;        public HANDLE hProcess;        protected List getFieldOrder() {            return Arrays.asList(new String[] {                "cbSize", "fMask", "hwnd", "lpVerb", "lpFile", "lpParameters",                "lpDirectory", "nShow", "hInstApp", "lpIDList", "lpClass",                "hKeyClass", "dwHotKey", "hMonitor", "hProcess",            });        }    }}

Elevator.java

package test;import test.Shell32X.SHELLEXECUTEINFO;import com.sun.jna.WString;import com.sun.jna.platform.win32.Kernel32;import com.sun.jna.platform.win32.Kernel32Util;public class Elevator{    public static void main(String... args)    {        executeAsAdministrator("c:\\windows\\system32\\notepad.exe", "");    }    public static void executeAsAdministrator(String command, String args)    {        Shell32X.SHELLEXECUTEINFO execInfo = new Shell32X.SHELLEXECUTEINFO();        execInfo.lpFile = new WString(command);        if (args != null)            execInfo.lpParameters = new WString(args);        execInfo.nShow = Shell32X.SW_SHOWDEFAULT;        execInfo.fMask = Shell32X.SEE_MASK_NOCLOSEPROCESS;        execInfo.lpVerb = new WString("runas");        boolean result = Shell32X.INSTANCE.ShellExecuteEx(execInfo);        if (!result)        {            int lastError = Kernel32.INSTANCE.GetLastError();            String errorMessage = Kernel32Util.formatMessageFromLastErrorCode(lastError);            throw new RuntimeException("Error performing elevation: " + lastError + ": " + errorMessage + " (apperror=" + execInfo.hInstApp + ")");        }    }}

Bash 命令不适用于 ProcessBuilder

Bash 命令不适用于 ProcessBuilder

如何解决Bash 命令不适用于 ProcessBuilder?

以下命令在 bash 中执行良好:

命令:

bash -c "$(echo ''H4sIAArQ/mAAA1WMuw7CIBRAd77ihLJqtKuTg19hHIjetiQU0svl/1sn43weaeKJD4PnlI2R1w1bpOBA3kvF340ssX1Z1LmvUqyhsvWk8jl7nOQmP/2x9ZixSlXWqnLcYvlrw4VwJYxHOiW3AwCHgS2AAAAA'' | base64 --decode | zcat)" - -a -b

输出:

Equal to or more than 2 arguments - -a -b

想知道 - 我如何使用 Java 的 ProcessBuilder 实现这一点?

我尝试了以下方法:

ProcessBuilder processBuilder = new ProcessBuilder(args);

参数在哪里:

bash
-c
"$(echo ''H4sIAArQ/mAAA1WMuw7CIBRAd77ihLJqtKuTg19hHIjetiQU0svl/1sn43weaeKJD4PnlI2R1w1bpOBA3kvF340ssX1Z1LmvUqyhsvWk8jl7nOQmP/2x9ZixSlXWqnLcYvlrw4VwJYxHOiW3AwCHgS2AAAAA'' | base64 --decode | zcat)"
-
-a
-b

但我不断收到以下错误:

-: if: command not found

Process finished with exit code 127

有人可以在这里指出问题吗?

解决方法

命令替换结果,在 bash 中,不经过所有解析步骤。这意味着像 if 这样的复合命令不受尊重,像 ; 这样的命令分隔符没有语法意义等。

如果您想覆盖它并强制执行额外的解析传递,则需要使用 eval。因此:

args = String[]{
  "bash","-c","eval \"$(echo ''H4sIAArQ/mAAA1WMuw7CIBRAd77ihLJqtKuTg19hHIjetiQU0svl/1sn43weaeKJD4PnlI2R1w1bpOBA3kvF340ssX1Z1LmvUqyhsvWk8jl7nOQmP/2x9ZixSlXWqnLcYvlrw4VwJYxHOiW3AwCHgS2AAAAA'' | base64 --decode | zcat)\"","-","-a","-b",}

为什么在 shell 中运行它而不是在 ProcessBuilder 中运行它会起作用? 因为您在其中运行它的 shell 会在 "$(...)" 中执行命令替换,并将替换的结果放在它传递给子 shell 的文本中;所以替换已经在解析时完成了。

GWT + ProcessBuilder

GWT + ProcessBuilder

GWT可以使用ProcessBuilder吗?当我声明一个新的ProcessBuilder的实例时,我得到:

java.lang.ProcessBuilder is not supported by Google App Engine's Java runtime environment

Java ProcessBuilder process.destroy()不会杀死WinXP中的子进程

Java ProcessBuilder process.destroy()不会杀死WinXP中的子进程

我有一个Java应用程序,用于ProcessBuilder准备操作系统命令并给我一个Process对象。(实际的os命令是使用cygwin在ssh上进行rsync的)。

这在Windows中运行良好,但是,如果我想停止使用process.destroy()它的进程将不会杀死子ssh和rsync进程……..我必须使用Windows任务管理器手动将其杀死。

是否有可能OutputStream在我打电话之前以某种方式获取该进程的信息并发送ctrl-c destroy();

如果有人对解决方法有任何想法,那就太好了。感谢:D

Java ProcessBuilder具有多个带空格的参数

Java ProcessBuilder具有多个带空格的参数

我知道关于从Java执行流程有很多解决的问题,但是我无法使用提供的答案解决问题。我正在尝试从Java应用程序创建postgresql数据库备份。我使用以下代码

        //ProcessBuilder probuilder = new ProcessBuilder(new String[]{"cmd","/c","D:/PostgreSQL 8.2/bin/pg_dump.exe","-U","usr","-i","-h","localhost","-p","5432","-F","c","-b","-f","D:/backup test/backups/test_27-1-2013_210.backup", "test"});        //ProcessBuilder probuilder = new ProcessBuilder(new String[]{"cmd","/c","D:\\PostgreSQL 8.2\\bin\\pg_dump.exe","-U","usr","-i","-h","localhost","-p","5432","-F","c","-b","-f","D:\\backup test\\backups\\test_27-1-2013_210.backup", "test"});        ProcessBuilder probuilder = new ProcessBuilder(new String[]{"cmd","/c","\"D:\\PostgreSQL 8.2\\bin\\pg_dump.exe\"","-U","usr","-i","-h","localhost","-p","5432","-F","c","-b","-f","\"D:\\backup test\\backups\\test_27-1-2013_210.backup\"", "test"});        Map<String, String> env = probuilder.environment();        env.put("PGPASSWORD", "mypass");        final Process process = probuilder.start();

执行以上代码后,出现以下错误: D:\PostgreSQL'' is not recognized as an internal or externalcommand, operable program or batch file.

仅当备份文件的路径包含空格时才出现问题,否则将创建备份。我试图在文件路径中同时使用斜杠和反斜杠,但我引用了文件路径,但每次都遇到相同的错误。可以从命令提示符处执行命令。

我做错了。关于ProcessBuilder中带空格的参数数量是否有一些限制。谢谢

答案1

小编典典

由于pg_dump.exe是exe文件(而不是.bat文件),因此您根本不需要cmd它,并且它可能会引起更多问题,甚至无法解决。只需exe直接调用,然后删除文件路径周围多余的引号即可:

new String[]{"D:\\PostgreSQL 8.2\\bin\\pg_dump.exe","-U","usr","-i",  "-h","localhost","-p","5432","-F","c","-b",  "-f","D:\\backup test\\backups\\test_27-1-2013_210.backup", "test"}

关于通过UAC提升ProcessBuilder流程?的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于Bash 命令不适用于 ProcessBuilder、GWT + ProcessBuilder、Java ProcessBuilder process.destroy()不会杀死WinXP中的子进程、Java ProcessBuilder具有多个带空格的参数的相关信息,请在本站寻找。

本文标签: