我正在研究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中执行?
答案 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)"'
请注意-ArgumentList
和NewUser
参数的不同引号。在调用嵌套的Powershell会话时,请注意以适当的方式构建参数字符串。