Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我想以admin的身份运行PowerShell,并通过Java在admin PowerShell中执行命令_Java_Powershell_Process_Exec - Fatal编程技术网

我想以admin的身份运行PowerShell,并通过Java在admin PowerShell中执行命令

我想以admin的身份运行PowerShell,并通过Java在admin PowerShell中执行命令,java,powershell,process,exec,Java,Powershell,Process,Exec,我正在开发一个Java程序,该程序允许我在PC上创建一个新的本地用户。唯一的问题是我必须以管理员身份执行PowerShell命令 当我运行该文件时,我输入了一个名称和密码。然后单击一个按钮,以管理员身份启动PowerShell 问题 创建新用户的命令未在我作为管理员启动的PowerShell中执行 String command=“powershell.exe启动进程powershell-动词runAs;新的LocalUser-Name”+str_Name+“-密码(ConvertTo Secur

我正在开发一个Java程序,该程序允许我在PC上创建一个新的本地用户。唯一的问题是我必须以管理员身份执行PowerShell命令

当我运行该文件时,我输入了一个名称和密码。然后单击一个按钮,以管理员身份启动PowerShell

问题 创建新用户的命令未在我作为管理员启动的PowerShell中执行

String command=“powershell.exe启动进程powershell-动词runAs;新的LocalUser-Name”+str_Name+“-密码(ConvertTo SecureString”+str_pass+“-AsPlainText-Force)”;
Process powerShellProcess=Runtime.getRuntime().exec(命令);
powerShellProcess.getOutputStream().close();
弦线;
System.out.println(“输出:”);
BufferedReader标准输出=新的BufferedReader(新的InputStreamReader(
powerShellProcess.getInputStream());
而((line=stdout.readLine())!=null){
系统输出打印项次(行);
}
stdout.close();
System.out.println(“错误:”);
BufferedReader stderr=新的BufferedReader(新的InputStreamReader(
powerShellProcess.getErrorStream());
而((line=stderr.readLine())!=null){
系统输出打印项次(行);
}
stderr.close();
系统输出打印项次(“完成”);
发生了什么 PowerShell正在以管理员身份打开,但实际命令是在正常的PowerShell中执行的,该PowerShell会打印此错误:
拒绝访问

这是因为我只能创建一个新的本地用户作为管理员


为什么我的命令没有在以管理员身份运行的PowerShell中执行?

让我们分析一下命令,看看会发生什么

"powershell.exe Start-Process powershell -Verb runAs ; New-LocalUser -Name " 
  + str_name 
  + " -Password (ConvertTo-SecureString " + str_pass + " -AsPlainText -Force)";
请注意
-动词RunAs
后面的分号。它是一个语句分隔符,因此
启动进程
将是一条语句,
新本地用户
将是另一条语句。作为伪代码:

启动powershell.exe。过程1

以管理员身份启动新的Powershell进程。过程2

运行新的LocalUser。过程1

注意到有趣的事了吗?新的本地用户正在原始的非提升的Powershell会话(进程1)中运行。因为它不是以管理员身份运行的,所以您将得到一个拒绝访问错误

要运行用户创建,需要将其命令传递给提升的Powershell进程,而不是父进程。使用
-ArgumentList
将命令传递给提升的命令,如下所示

powershell.exe Start-Process powershell -Verb runAs -ArgumentList `
  'New-LocalUser -Name "TestUser" -Password `
  (ConvertTo-SecureString "H4rdT0Gue$$" -AsPlainText -Force)"'
注意
-ArgumentList
NewUser
参数的不同引号。调用嵌套的Powershell会话时,请注意以适当的方式构建参数字符串。

有关正确创建和处理进程的许多好提示,请参阅。然后忽略它引用
exec
,并使用
ProcessBuilder
创建流程。还可以将
字符串arg
分解为
字符串[]args
,以说明包含空格字符的路径之类的情况。