ทำไม PsExec หยุดทำงานหลังจากเรียกใช้สคริปต์ PowerShell สำเร็จแล้ว


12

สคริปต์ตรงไปตรงมาค่อนข้าง เพียงพยายามเริ่มบริการ windows การประมวลผลในเครื่องทำงานได้ดีเมื่ออยู่บนเครื่องเป้าหมาย สคริปต์ทำงานได้ดีเช่นกันเมื่อดำเนินการผ่าน PsExec มันจะไม่ส่งคืนจนกว่าฉันจะกดปุ่ม "Enter" บนพรอมต์ CMD ของฉัน นี่เป็นปัญหาเนื่องจากสิ่งนี้ถูกเรียกจาก TeamCity และทำให้ Agent หยุดทำงานเพื่อรอ PsExec กลับมา

ฉันได้ลองทำสิ่งต่อไปนี้แล้ว:

  • การเพิ่มexitและexit 0ท้ายสคริปต์ Powershell
  • เพิ่ม a < NULถึงจุดสิ้นสุดของการเรียก PsExec ตามคำตอบในคำถาม SF นี้
  • การเพิ่มการ>เปลี่ยนเส้นทาง stdout

นี่คือวิธีที่ฉันเรียก psexec:

psexec \\target -u domain\username -p password powershell c:\path\script.ps1

ไม่ว่าฉันจะทำอะไรมันแฮงค์จนกว่าฉันจะอยู่บนโลคอลพร้อมรับคำสั่ง cmd หลังจากที่ฉันกด Enter ฉันได้รับข้อความ:

powershell exited on target with error code 0.

คำตอบ:


11

ปรากฎว่านี่เป็นปัญหาที่พบบ่อย พบวิธีแก้ปัญหาที่นี่ โดยพื้นฐานแล้วถ้าคุณไพพ์ข้อมูลบน stdin ด้วย cmd มันจะกลับมาอย่างเหมาะสมหลังจากการประมวลผล (เพราะมันถูกเรียกใช้ผ่าน cmd ไม่ใช่ powerhell)

ตัวอย่าง:

psexec \\target -u domain\username -p password cmd /c "echo . | powershell c:\path\script.ps1"

มันตั้งค่าเป็น Command Line - Custom Script หรือ Command Line - Executionable (ใน TeamCity) หรือไม่
Wojtek Turowicz

ตกลงฉันตั้งค่าเป็นปฏิบัติการและช่วยได้ ขอบคุณเพื่อนฉันใช้เวลา 1 วันในการวิเคราะห์ กระจายคำ!
Wojtek Turowicz

หลังจากวันที่เป็นปัญหาที่ส่งกลับ ...
Wojtek Turowicz

11

ฉันรู้ว่าคำตอบมาสายมันจะถูกคิดออกแล้วถ้าไม่มันอาจจะมีประโยชน์สำหรับผู้เยี่ยมชมในอนาคต

STDIN จะต้องถูกนำมาใช้อีกครั้งในการดำเนินการ PowerShell เพื่อให้สามารถมาจากแฮงค์ (ที่นี่จะรอใน STDIN) เพื่อให้สามารถใช้งานได้ - ใส่รูปแบบที่ไม่มี

powershell -inputformat none -File powershell_script.ps1 จะทำงาน.

ตรวจสอบ - https://connect.microsoft.com/PowerShell/feedback/details/572313/powershell-exe-can-hang-if-stdin-is-redirected


ไม่เพียงทำงานได้ แต่ยังอธิบายว่าทำไมคำตอบที่ยอมรับจึงใช้ได้ ขอบคุณ!
jpaugh

5
psexec \\target -u domain\username -p password -d powershell c:\path\script.ps1

แก้ไขปัญหาด้วย

การ-dตั้งค่าสถานะสำหรับ psexecเป็นเหมือน "run and exit" ในลักษณะที่ไม่โต้ตอบ:

-d อย่ารอให้แอปพลิเคชั่นหยุดการทำงาน

ใช้สำหรับแอปพลิเคชันที่ไม่โต้ตอบเท่านั้น



0

ฉันทำงานpsexecกับสคริปต์ VBS และโซลูชันที่ทำเครื่องหมายว่าดีที่สุด (EX:) psexec \\target -u domain\username -p password cmd /c "echo . | powershell c:\path\script.ps1"ทำงานให้ฉันเฉพาะระหว่างการเรียกใช้ครั้งที่สาม ฉันขุดต่อไปและพบคำอธิบายของสวิตช์แต่ละอัน

ฉันตัดสินใจลอง "-s" และสิ่งที่เหมาะกับฉันทุกครั้งนี่คือตัวอย่างของฉัน:

call C:\psexec.exe %SERVER_NAME% -u %USERNAME% -p %PASSWORD% -h -s cscript %pathTomyVBSscript%
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.