我想 运行 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)"'
请注意 -ArgumentList
和 NewUser
参数的不同引号。调用嵌套的 Powershell 会话时,注意以适当的方式构建参数字符串。
我正在开发一个 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)"'
请注意 -ArgumentList
和 NewUser
参数的不同引号。调用嵌套的 Powershell 会话时,注意以适当的方式构建参数字符串。