Команда powershell не будет запускаться как надо из скрипта python - PullRequest
0 голосов
/ 17 марта 2020

я пытаюсь запустить эту команду powershell:

Unregister-ScheduledTask -TaskPath "\Lsports Tasks" -a

когда я запускаю его из powershell, он работает нормально, и я получаю тот же выход из скрипта python, но когда я запускаю его из моего python скрипт ничего не происходит, я получаю тот же вывод, который получаю из команды powershell, но он не работает, вот мой скрипт:

import psutil
import os
os.system("""powershell -command ""Unregister-ScheduledTask -TaskPath "\Lsports Tasks\" -a""")
commands = []
for proc in psutil.process_iter(['pid','name']):
  process = proc.info 
  if process['name'] == 'svchost.exe':
     pid = process['pid']
     cmds = psutil.Process(pid=int(pid)).cmdline()
     cmd = ' '.join(cmds)
     commands.append(cmd)

i = 0
for c in commands:
  i+= 1
  task = os.system(f"""SCHTASKS /CREATE /SC ONSTART /RU system /TN "Lsports Tasks\Lsports Runner{i}" /TR "{c}""".format(i,c=c))

вывод, полученный из команды:

 CimJob1         CimJob          Running 

Спасибо!

1 Ответ

0 голосов
/ 17 марта 2020

Во-первых, вы должны предоставить привилегии администратора программы. И это работает. (Вкл. windows) примерно так:

import ctypes
import time
import sys
import os
import psutil


def is_admin():
    try:
        return ctypes.windll.shell32.IsUserAnAdmin()
    except:
        return False


if is_admin():
    os.system("""powershell -command ""Unregister-ScheduledTask -TaskPath "\Lsports Tasks\" -a""")
    commands = []
    for proc in psutil.process_iter(['pid', 'name']):
        process = proc.info
        if process['name'] == 'svchost.exe':
            pid = process['pid']
            try:
                cmds = psutil.Process(pid=int(pid)).cmdline()
            except:
                pass
            cmd = ' '.join(cmds)
            commands.append(cmd)

i = 0
for c in commands:
    i += 1
    task = os.system(f"""SCHTASKS /CREATE /SC ONSTART /RU system /TN "Lsports Tasks\Lsports Runner{i}" /TR "{c}""".format(i, c=c))
else:
    if sys.version_info[0] == 3:
        ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, __file__, None, 1)
    else:
        ctypes.windll.shell32.ShellExecuteW(None, u"runas", unicode(sys.executable), unicode(__file__), None, 1)

Когда я запускаю это в админке, это правильно, и, возможно, какой-то pid мисс. Так что добавьте кеш ex c здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...