对于通过UAC提升ProcessBuilder流程?感兴趣的读者,本文将提供您所需要的所有信息,并且为您提供关于Bash命令不适用于ProcessBuilder、GWT+ProcessBuilder、
对于通过UAC提升ProcessBuilder流程?感兴趣的读者,本文将提供您所需要的所有信息,并且为您提供关于Bash 命令不适用于 ProcessBuilder、GWT + ProcessBuilder、Java ProcessBuilder process.destroy()不会杀死WinXP中的子进程、Java ProcessBuilder具有多个带空格的参数的宝贵知识。
本文目录一览:- 通过UAC提升ProcessBuilder流程?
- Bash 命令不适用于 ProcessBuilder
- GWT + ProcessBuilder
- Java ProcessBuilder process.destroy()不会杀死WinXP中的子进程
- Java 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 中执行良好:
命令:
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吗?当我声明一个新的ProcessBuilder的实例时,我得到:
java.lang.ProcessBuilder is not supported by Google App Engine's Java runtime environment
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执行流程有很多解决的问题,但是我无法使用提供的答案解决问题。我正在尝试从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具有多个带空格的参数的相关信息,请在本站寻找。
本文标签: