Ausführen von Bat-Dateien aus der Ferne mit Psexec aus der Teamstadt innerhalb des Powershell-Befehls


7

Ich habe einen Powershell-Befehl, der in TeamCity ausgeführt wird. Wenn ich versuche, eine Batchdatei mit psexec aus dieser .ps-Datei remote auszuführen, wird nach dem Start der Remote-Ausführung nichts mehr angezeigt. Ich habe verschiedene Möglichkeiten ausprobiert, die in mehreren Foren diskutiert wurden, aber keinen Nutzen hatten.

Main.ps::

Invoke-Command -ScriptBlock {C:\PSInstall.bat}

PSInstall.bat::

C:\Tools\psexec.exe -i -d "\\server2" -u "domain\admin" -p "abcd" -f -w cmd "C:\Install.bat"

Mein Build-Protokoll:

[11:32:02]C:\BuildAgent\work\603cfc01a3fe22bb\Tools>C:\Tools\psexec.exe -i -d "\\server2" -u "domain\admin" -p "abcd" -f -w cmd "C:\Install.bat" 
[11:32:02]
[11:32:02]PsExec v1.98 - Execute processes remotely
[11:32:02]Copyright (C) 2001-2010 Mark Russinovich
[11:32:02]PsExec executes a program on a remote system, where remotely executed console
[11:32:02]Sysinternals - www.sysinternals.com
[11:32:02]applications execute interactively.

Ich stecke an diesem Punkt fest und habe keine Ahnung, was passiert. Jede Hilfe wird sehr geschätzt. Ich habe EULA bereits auf dem Remote-Computer eingestellt.


Was passiert, wenn Sie die Befehle direkt von Powershell aus ausführen (TeamCity vorerst vergessen)? Funktioniert es in Ordnung?
— Chris

Ich habe das gleiche Problem und es funktioniert direkt von Powershell. Muss ein Berechtigungsproblem sein?
— stuartdotnet

Antworten:


1

Die PsExecBefehle / Argumente, die Sie in Ihrem Beispiel angegeben haben, sind fehlerhaft. Versuchen Sie stattdessen:

C:\Tools\PsExec.exe \\server2 -u "domain\admin" -p "abcd" "C:\Install.bat" -i -d -f -w

Stellen Sie alles zusammen mit einem Beispiel, das aus etwas stammt, das ich zuvor geschrieben habe. PSExecRetry.logenthält die Ausgabe von PsExec(einschließlich Fehlern), erfasst jedoch nicht die StdOut/StdErrAusgabe des nachfolgenden Befehls wie sie ist.

PSExecRetry.ps1 ist das PowerShell-Skript mit einer grundlegenden Wiederholungslogik:

#PSExecRetry.ps1

$LogFile = "PSExecRetry.log"
$defaultSleepSecs = 3
$RetryCount = 3
$StopLoop = $false
$retries = 1

try {
    # open the log file
    Start-Transcript -path $LogFile -append
    do {
        try
        {
            $Command = "C:\PSInstall.bat"
            Write-Host "Executing command" $Command ".`r"
            Invoke-Expression -Command $Command

            if ($LastExitcode -ne 0)
            {
                throw "Retry {0} of {1}" -f $retries, $RetryCount
            }
            else
            {
                $StopLoop = $true
            }
        }
        catch
        {
            if ($retries -gt $RetryCount)
            {
                Write-Host("Exception.Message={0}; InvocationInfo.ScriptName={1}" -f $_.Exception.Message, $_.InvocationInfo.ScriptName)
                Write-Host("Giving up after {0} retries.`r" -f $RetryCount)
                $StopLoop = $true
            }
            else
            {
                Write-Host("Exception.Message={0}; InvocationInfo.ScriptName={1}" -f $_.Exception.Message, $_.InvocationInfo.ScriptName)
                Write-Host("Exception, retrying in {0} seconds.`r" -f $defaultSleepSecs)
                Start-Sleep -Seconds $defaultSleepSecs
                $retries = $retries + 1        
            }
        }
    } While ($StopLoop -eq $false)
}
catch
{
    Write-Host("Exception.Message={0}; InvocationInfo.ScriptName={1}" -f $_.Exception.Message, $_.InvocationInfo.ScriptName)
}
finally
{
    Stop-Transcript
}

PSInstall.cmd wird wie folgt geändert:

#PSInstall.cmd

C:\PsExec.exe \\server2 -u "domain\admin" -p "abcd" "C:\Install.bat" -i -d -f -w

Install.bat Stummel:

#Install.bat

echo Hello world!
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.