簡體   English   中英

無法通過 runas 命令捕獲 output

[英]Not able to capture output by runas command

我必須自動化測試用例。

任務:-

  1. 步驟:- 從 powershell 打開管理命令提示符。
  2. 步驟:- 在管理命令提示符下執行批處理文件。
  3. 步驟:-批處理文件包括一些命令集,包括一個 exe 的執行。

    例如:- runas /user:administrator /savecred someCmd.exe >>D:\output.txt

  4. 步驟:- 在變量中捕獲 exe 的 output 以驗證 output。

我已經使用“start-process -verb runas cmd.exe $param”cmdlet 來打開管理命令提示符(步驟 1)。 其中 $param 包含要執行的批處理文件。

問題陳述:- 當批處理文件執行上述 runas 命令時,它會打開一個新的命令提示符,並且 output 會顯示在提示符中並自行關閉。 我無法捕獲輸出(未寫入 output.txt),基於此我必須進行一些驗證。

您可以使用批處理的輸出重定向:

$params="/C ipconfig /all 2>&1 >>c:\temp\test.txt" 
start-process -verb runas cmd.exe $params 
gc c:\temp\test.txt

解決方案

  1. 從 powershell 打開管理命令提示符。
  2. runas命令中執行了一個批處理文件。 例如: runas /user:administrator /savecred mybatch.bat
  3. 批處理文件包括一些命令集,包括一個 exe 的執行。 例如someCmd.exe >>D:\output.txt
  4. 在變量中捕獲 exe 的輸出以驗證輸出。

現在輸出被捕獲並寫入文件。 我的目標是捕獲命令的輸出,這就是我解決它的解決方案。

我最終創建了一個包含至少兩個參數的包裝批處理文件 OutputWrapper.bat:
1) 輸出文件
2) 命令
3) [可選] 參數

@ECHO OFF

IF "%2" == "" GOTO usage

SET OUTPUTFILE=%1
SET COMMAND=%2
SET ARGS=

SHIFT /2

:loop1
IF "%2"=="" GOTO exec
SET ARGS=%ARGS% %2
SHIFT
GOTO loop1

:exec
ECHO Command [%COMMAND%]
ECHO Arguments [%ARGS%]
ECHO Output file [%OUTPUTFILE%]

%COMMAND%%ARGS% > %OUTPUTFILE% 2>&1
GOTO end

:usage
ECHO Usage: %~nx0 outputfile command [arguments]

:end

並像這樣從 PowerShell 調用它:

$outFile = "C:\Temp\Deploy.out";

Start-Process -FilePath .\OutputWrapper.bat -ArgumentList "$outfile","whoami.exe","/priv" -Verb RunAs -Wait

Get-Content $outFile;

我遇到了同樣的問題並通過使用gsudo解決了它。 它讓我運行提升的命令並將輸出從它傳送回來。

gsudo {command-to-execute}

改進Loïc MICHEL 的答案,因為沒有-WaitGet-Content很可能會在過程完成之前運行。 由於 output 直到進程結束才被寫入, Get-Content由於文件不存在而失敗。

$param = "ipconfig /all"
$args = "/C $param 2>&1 > C:\temp\test.txt"
Start-Process -FilePath cmd.exe -ArgumentList $args -Verb RunAs -Wait
Get-Content -Path C:\temp\test.txt

或者,使用powershell.exe和操作系統臨時目錄中的隨機文件:

$CommandWithParameters = "gpresult /scope computer /z"

$OutputFile = Join-Path -Path ([System.IO.Path]::GetTempPath()) -ChildPath ([System.IO.Path]::GetRandomFileName())
$Arguments = ("{0} 2>&1 > {1}" -f $CommandWithParameters, $OutputFile)
Start-Process -FilePath powershell.exe -ArgumentList $Arguments -Verb RunAs -Wait

Get-Content -Path $OutputFile

使用powershell.exe將使用 UCS-2 LE BOM 編碼保存 output 文件。 如果您使用cmd.exe ,編碼將是 ANSI。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM