我想 运行 PowerShell 作为管理员并在管理员权限下执行命令 shell THROUGH Java

I want to run PowerShell as admin AND execute a command in the admin power shell THROUGH Java

我正在开发一个 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

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

为什么我的命令没有在 运行宁作为管理员的 PowerShell 中执行?

让我们解析命令看看会发生什么。

"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 将成为另一个语句。作为伪代码:

Start powershell.exe. Process 1

Start a new Powershell process as admin. Process 2

Run New-LocalUser. Process 1

注意到什么有趣的事了吗? New-LocalUser 原始 、non-elevated Powershell 会话(进程 1)中被 运行。由于它不是管理员 运行,您将收到拒绝访问错误。

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

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

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