从Java内部调用PowerShell脚本作为其他用户

时间:2017-03-25 00:43:10

标签: java powershell

我从命令行调用时有一系列按预期工作的脚本,但是如果同一个用户正在运行TomCat作为同一帐户下的服务Start-Process似乎返回而没有做任何事情

我的问题是,在从Java执行的命令中构建的环境是否存在某种本质上的不同?任何指针都会有所帮助。

从命令行调用

如果我在非提升的命令提示符下以cuser1身份登录时发出命令 cmd /c c:\test\test.bat ,我会看到以下日志:

HS0\cuser1 called script as HS0\cuser2
Script running as HS0\cuser2

从Java进程调用

如果我使用TomCat应用程序中的 Runtime.getRuntime().exec() 发出相同的命令,我就看不到切换。

List<String> cmd = new ArrayList<>();
cmd.add("cmd");
cmd.add("/c");
cmd.add("C:\\test\\test.bat");
final Process process = Runtime.getRuntime().exec(cmd);
...
// Handling the command output, nothing in the output, no error result

相反,我只看到日志的第一行。我一直在捕获异常,查看异常并读取命令的输出,但似乎Start-Process命令立即返回而没有错误代码。这显然是带有硬编码凭证的测试代码,而不是真正的交易,但我可以在这个简化的代码中看到相同的行为。

测试

c:\test\test.bat => calls a PowerShell script
c:\test\test-switch.ps1 => invokes a PowerShell script as different user
c:\test\test.ps1 => display current user

test.bat的

PowerShell -NoProfile -ExecutionPolicy Bypass -File "c:\test\test-switch.ps1"

测试switch.ps1

$currentUser = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name
$pwd = ConvertTo-SecureString "password" -asplaintext -force
$cred = New-Object System.Management.Automation.PSCredential ("HS0\cuser2", $pwd)
$args = "-NoProfile -ExecutionPolicy Bypass -File c:\test\test.ps1"
Start-Process Powershell -Credential $cred -ArgumentList $args
"$currentUser called script as HS0\cuser2"  | Out-File 'c:\test\test.log' -Append

test.ps1

$currentUser = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name
"Script running at $(Get-Date) as $currentUser"  | Out-File 'c:\test\test.log' -Append

0 个答案:

没有答案