我想以admin的身份运行PowerShell,并通过Java在admin PowerShell中执行命令
我正在开发一个Java程序,该程序允许我在PC上创建一个新的本地用户。唯一的问题是我必须以管理员身份执行PowerShell命令 当我运行该文件时,我输入了一个名称和密码。然后单击一个按钮,以管理员身份启动PowerShell 问题 创建新用户的命令未在我作为管理员启动的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
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
,以说明包含空格字符的路径之类的情况。