Python не может получить вывод из PowerShell

#powershell #python #sccm

#powershell #python #sccm

Вопрос:

Я пытаюсь использовать этот код, чтобы получить список действий в SCCM, загруженных в python, но все, что я получаю в retun, — это пустая строка байтов.

 count = r"""
if (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
{
  $arguments = "amp; '"  $myinvocation.mycommand.definition   "'"
  Start-Process powershell -Verb runAs -ArgumentList $arguments
  Break
}

$CMGR = New-Object -ComObject CPApplet.CPAppletMgr

$ClientActions = Out-String ($CMGR.GetClientActions() | Select Name).count
$ClientActions
"""

def runPS(command):
    import subprocess
    process=subprocess.run(["powershell", "-ExecutionPolicy", "Bypass", command],stdout=subprocess.PIPE);
    print(process.stdout)
  

Все эти выходные данные b''

Что я делаю не так???

РЕДАКТИРОВАТЬ: я понял часть этого. Это потому, что он технически запускает другой powershell внутри этого (Python>> Powershell>> Admin Powershell), а второй не возвращает свое значение первому. (Python <> Powershell >> Admin Powershell)

Комментарии:

1. Попробуйте более простой Powershell, например, привет, мир! пример. Работает ли его вывод? Если это так, что-то не так с SCCM Powershell. Если этого не происходит, что-то нужно для получения выходных данных из процесса.

2. @vonPryz Я это сделал, и он фактически получает возвращаемое значение. Странная часть заключается в том, что когда я запускаю это в окне Powershell (без python), он возвращает правильное число (в данном случае «9»)

Ответ №1:

Я бы предложил использовать check_output() вместо run() here . Это позволяет вам обнаруживать ненулевой код выхода из дочернего процесса. Дополнительная информация здесь. Возможно, по какой-то причине Powershell не работает, но вы не фиксируете stderr или не проверяете код возврата.

Что-то вроде этого может быть более надежным:

 def runPS(command):
    import subprocess
    output = subprocess.check_output(["powershell", "-ExecutionPolicy", "Bypass", command])
    return output
  

РЕДАКТИРОВАТЬ: я понял часть этого. Это потому, что он технически запускает другой powershell внутри этого (Python>> Powershell>> Admin Powershell), а второй не возвращает свое значение первому. (Python <> Powershell >> Admin Powershell)

Хм. Извините, я не знаю powershell, поэтому я не могу помочь вам с этой половиной.