我想以管理员身份运行PowerShell,并通过Java在admin电源外壳中执行命令

时间:2019-07-19 06:14:43

标签: java powershell process exec

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

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

问题

我以管理员身份启动的PowerShell中没有执行创建新用户的命令。

String command = "powershell.exe Start-Process powershell -Verb runAs ; New-LocalUser -Name " + str_name + " -Password (ConvertTo-SecureString " + str_pass + " -AsPlainText -Force)";
Process powerShellProcess = Runtime.getRuntime().exec(command);
powerShellProcess.getOutputStream().close();
String line;
System.out.println("Output:");
BufferedReader stdout = new BufferedReader(new InputStreamReader(
        powerShellProcess.getInputStream()));
while ((line = stdout.readLine()) != null) {
    System.out.println(line);
}
stdout.close();
System.out.println("Error:");
BufferedReader stderr = new BufferedReader(new InputStreamReader(
        powerShellProcess.getErrorStream()));
while ((line = stderr.readLine()) != null) {
    System.out.println(line);
}
stderr.close();
System.out.println("Done");

会发生什么

PowerShell以管理员身份打开,但实际命令在正常的PowerShell中执行,并显示以下错误:access denied

那是因为我只能以admin身份创建一个新的本地用户。

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

1 个答案:

答案 0 :(得分:2)

让我们分析命令以查看会发生什么。

"powershell.exe Start-Process powershell -Verb runAs ; New-LocalUser -Name " 
  + str_name 
  + " -Password (ConvertTo-SecureString " + str_pass + " -AsPlainText -Force)";

注意-Verb RunAs之后的分号。这是一个语句分隔符,因此Start-Process将是一个语句,而New-LocalUser将是另一个语句。作为伪代码:

  

启动powershell.exe。流程1

     

以管理员身份开始新的Powershell进程。流程2

     

运行New-LocalUser。流程1

注意有什么好笑的吗? New-LocalUser原始的非高架Powershell会话中运行(进程1)。由于它不是以Admin身份运行的,因此您会收到拒绝访问错误。

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

powershell.exe Start-Process powershell -Verb runAs -ArgumentList `
  'New-LocalUser -Name "TestUser" -Password `
  (ConvertTo-SecureString "H4rdT0Gue$$" -AsPlainText -Force)"'

请注意-ArgumentListNewUser参数的不同引号。在调用嵌套的Powershell会话时,请注意以适当的方式构建参数字符串。