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.