我从命令行调用时有一系列按预期工作的脚本,但是如果同一个用户正在运行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