是Invoke-Command所需的返回码

时间:2014-09-10 17:55:03

标签: powershell powershell-remoting psexec invoke-command

Powershell脚本

  1. 在远程计算机上启用PSRemoting
  2. 在远程计算机上执行setup.exe
  3. 在远程计算机上禁用PSRemoting
  4. 在远程计算机能够执行setup.exe后,如何确定禁用PSRemoting?

    我是否在远程计算机能够执行setup.exe之前禁用PSRemoting?

    $password = get-content D:\Script\cred.txt | convertto-securestring
    $credentials = new-object -typename System.Management.Automation.PSCredential -argumentlist "Administrator",$password
    $j = "remote_computer"
    
    $comp = "\\"+$j
    
    $exe = "setup.exe"
    [String]$cmd = "cmd /c 'C:\share\$exe'"
    [ScriptBlock]$sb = [ScriptBlock]::Create($cmd) 
    
    
    $bstr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($password)
    $str =  [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR($bstr)
    [System.Runtime.InteropServices.Marshal]::ZeroFreeBSTR($bstr)
    
    
    
    $enable_command = "D:\PSTools\PsExec.exe $comp -u Administrator -p $str -accepteula powershell.exe c:\share\ps_enable.ps1"
    
    Invoke-Expression $enable_command
    
    
    try{
        invoke-command -ComputerName $j -Credential $credentials -ScriptBlock $sb
    
    }
    catch [System.Exception]{
        continue
    }
    
    
    $disable_command = "D:\PSTools\PsExec.exe $comp -u Administrator -p $str -accepteula powershell.exe c:\share\ps_disable.ps1"
    
    Invoke-Expression $disable_command
    

1 个答案:

答案 0 :(得分:1)

很简单,使用Invoke-Command的AsJob开关并将其分配给变量。然后使用Wait-Job,以便在继续禁用PSRemoting之前知道作业已完成。

try{
    $SetupJob = invoke-command -ComputerName $j -Credential $credentials -ScriptBlock $sb -AsJob

}
catch [System.Exception]{
    continue
}

$SetupJob|Wait-Job

$disable_command = "D:\PSTools\PsExec.exe $comp -u Administrator -p $str -accepteula powershell.exe c:\share\ps_disable.ps1"

Invoke-Expression $disable_command