Форум программистов, компьютерный форум, киберфорум
Assembler: Windows/protected mode
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
0 / 0 / 1
Регистрация: 28.06.2016
Сообщений: 114

Запустить powershell с параметрами и вернуть в переменную

04.04.2017, 01:13. Показов 4300. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пробую через winapi запустить процесс Powershell с параметрами и получаю ошибку которая не поддается здравой логике, постоянно выскакивает и закрывается окно cmd. Подскажите в какую сторону копать?
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
format PE GUI 4.0
entry start
 
include 'win32a.inc'
start:
    invoke CreateThread,0,0,run_ps,0,0,id
 
proc run_ps
    invoke CreateProcess,0,fileName,params,NULL,NULL,NULL,CREATE_NEW_CONSOLE,NULL,NULL,sinfo,pinfo
    ;invoke ShellExecute, 0, 0, fileName, params, 0, SW_SHOW
    invoke ExitProcess, 0
endp
 
data import
library kernel32, 'kernel32.dll',\
        shell32, 'shell32.dll'
 
import  kernel32,\
                ExitProcess, 'ExitProcess',\
                CreateProcess, 'CreateProcessA',\
                CreateThread, 'CreateThread'
 
import  shell32,\
                ShellExecute, 'ShellExecuteA'
 
fileName db "powershell",0
params db "Get-ChildItem test_write >1.txt 2>&1", 0
sinfo   STARTUPINFO
pinfo   PROCESS_INFORMATION
id dd ?
 
end data
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.04.2017, 01:13
Ответы с готовыми решениями:

Запустить программу с параметрами и вернуть ответ
Возникла идея поиграться с WinMerge. Необходимо на C++ написать программу которая самостоятельно сравнивала бы файлы. Нашел справку по...

Запустить PowerShell-скрипт как службу
Есть скрипт, он находит некоторый процесс (он в кол. 4 штук) и разбрасывает каждый процесс на каждое ядро. Итого каждый процесс выполняется...

Получение значения ячейки Excel в переменную Powershell
Доброго времени суток, столкнулся с проблемой выборки данных из таблицы в пристежке: Два столбца со значениями. Нужно, если поиск...

11
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
04.04.2017, 07:57
Лучший ответ Сообщение было отмечено Victoros6666 как решение

Решение

Мне кажется, что ошибочна строка с перенаправлением вывода
params db "Get-ChildItem test_write >1.txt 2>&1", 0

Попробуйте запускать из программы простые скрипты (вывод "Hello" и ожидание клавиши) - убедиться в корректности программы.
Потом запускать из cmd powershell с такой строкой параметров.
После удачных пусков переходить к пуску данного скрипта из программы.
1
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6808 / 2048 / 238
Регистрация: 14.12.2014
Сообщений: 4,297
Записей в блоге: 12
04.04.2017, 21:06
Лучший ответ Сообщение было отмечено Victoros6666 как решение

Решение

Ооо, друг мой, тут куча всего...

Во-первых, почему данные в секции импорта?
Вынеси fileName и всё прочее перед data import

Во-вторых, ты создаёшь поток и главным потоком входишь в его же код. Странно.
Т.е. у тебя и основной поток и вновь созданный работают параллельно в одном и том же коде...
Или ты думаешь, что после CreateThread текущий поток приостановится?
Да и зачем он вообще нужен этот поток?

В-третьих, что за лишний первый параметр 0 у CreateProcess?
И перед вызовом структура sinfo должна содержать корректные данные.

В-четвёртых, если используется CreateProcess, то путь к файлу powershell.exe должен быть полным, т.е. с путём и расширением.
Это не ShellExecute (который закомментирован).

В общем, корректный вариант будет таким:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
format PE GUI 4.0
entry start
 
include 'win32a.inc'
start:
;    invoke CreateThread,0,0,run_ps,0,0,id
 
run_ps:
    ;invoke CreateProcess,fileName,params,NULL,NULL,NULL,CREATE_NEW_CONSOLE,NULL,NULL,sinfo,pinfo
    invoke ShellExecute, 0, 0, fileName, params, 0, SW_SHOW
    invoke ExitProcess, 0
 
fileName db "powershell",0
params db "Get-ChildItem test_write >1.txt 2>&1", 0
;sinfo   STARTUPINFO
;pinfo   PROCESS_INFORMATION
;id dd ?
 
data import
library kernel32, 'kernel32.dll',\
        shell32, 'shell32.dll'
 
import  kernel32,\
                ExitProcess, 'ExitProcess',\
                CreateProcess, 'CreateProcessA',\
                CreateThread, 'CreateThread'
 
import  shell32,\
                ShellExecute, 'ShellExecuteA'
 
end data
p.s. Если просто убрать invoke CreateThread, то процедура run_ps компилироваться не будет, так что надо убрать слова proc/endp

Добавлено через 3 минуты
И ещё неплохо бы разделить секции кода и данных:
Assembler
1
section '.text' code readable executable
Assembler
1
section '.data' data readable writeable
3
0 / 0 / 1
Регистрация: 28.06.2016
Сообщений: 114
05.04.2017, 00:35  [ТС]
Через CreateProcess запустил powershell, спасибо всем за помощь. Но не могу понять почему происходит следующие, если запустить из программы данный код. Функция скачивается, но не запускается соответственное данные которые возвращает функция не передаются в файл.

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
format PE GUI 4.0
entry run_ps
 
include 'win32a.inc'
 
proc run_ps
    invoke CreateProcess,fileName,params,NULL,NULL,NULL,CREATE_NEW_CONSOLE,NULL,NULL,sinfo,pinfo
    invoke ExitProcess, 0
endp
 
data import
library kernel32, 'kernel32.dll',\
 
import  kernel32,\
                ExitProcess, 'ExitProcess',\
                CreateProcess, 'CreateProcessA',\ 
 
fileName db "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe",0
params db "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/gangstanthony/PowerShell/master/Get-Firewall.ps1');Get-Firewall > 1.txt",0
sinfo   STARTUPINFO
pinfo   PROCESS_INFORMATION
id dd ?
 
end data
Если запустить из powershell все отрабатывает отлично.
PowerShell
1
IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/gangstanthony/PowerShell/master/Get-Firewall.ps1');Get-Firewall > 1.txt
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6808 / 2048 / 238
Регистрация: 14.12.2014
Сообщений: 4,297
Записей в блоге: 12
05.04.2017, 11:14
Лучший ответ Сообщение было отмечено Victoros6666 как решение

Решение

Нерабочий исходник (из-за висячих строк с ,\ на конце).

А не идёт запись потому, что "> 1.txt" - это не команда для powershell, это команда для cmd. Чем ShellExecute не устраивает?

Если нужно получить содержимое вывода в StdOut, можно не создавать файл. Создаётся пайп через CreatePipe (<– ссылка), хэндлы StdIn и StdOut созданного пайпа указываются в структуре STARTUPINFO создаваемого процесса. Далее создаётся процесс (CreateProcess) и ожидается его завершение (WaitForSingleObject). И потом можно из пайпа прочитать данные через ReadFile. Ну и в финале нужно закрыть все хэндлы (пайпа и из структуры PROCESS_INFORMATION).

В общем, вот исходник на Delphi из одной программки, разбирайся
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
function ExecMountvol(const Param1, Param2: String): String;
const BufSize = 10000;
var
  SecAttr: TSecurityAttributes;
  hReadPipe, hWritePipe: THandle;
  StartupInfo: TStartUpInfo;
  ProcessInfo: TProcessInformation;
  P: PChar;
  N: DWord;
begin
  with SecAttr do
  begin
    FillChar(SecAttr, SizeOf(SecAttr), 0);
    nLength        := SizeOf(SecAttr);
    bInheritHandle := True
  end;
  if CreatePipe(hReadPipe, hWritePipe, @SecAttr, 0) then
  try
    FillChar(StartupInfo, SizeOf(StartupInfo), #0);
    StartupInfo.cb          := SizeOf(StartupInfo);
    StartupInfo.hStdOutput  := hWritePipe;
    StartupInfo.hStdInput   := hReadPipe;
    StartupInfo.dwFlags     := STARTF_USESTDHANDLES +
                               STARTF_USESHOWWINDOW;
    StartupInfo.wShowWindow := SW_HIDE;
 
    if CreateProcess(PChar(GetEnvironmentVariable('windir')+'\system32\mountvol.exe'), PChar(' '+CheckParam(Param1)+' '+CheckParam(Param2)),
      @SecAttr, @SecAttr, True, NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) then
      if WaitForSingleObject(ProcessInfo.hProcess, 5000) = WAIT_OBJECT_0    then
      begin
        GetMem(P, BufSize+1);
        try
          ReadFile(hReadPipe, P^, BufSize, N, nil);
          Result := P;
        finally
          FreeMem(P, BufSize+1)
        end
      end;
  finally
    CloseHandle(ProcessInfo.hProcess);
    CloseHandle(ProcessInfo.hThread);
    CloseHandle(hReadPipe);
    CloseHandle(hWritePipe)
  end
end;
1
0 / 0 / 1
Регистрация: 28.06.2016
Сообщений: 114
05.04.2017, 12:24  [ТС]
Цитата Сообщение от Jin X Посмотреть сообщение
Если нужно получить содержимое вывода в StdOut, можно не создавать файл. Создаётся пайп через CreatePipe (<– ссылка), хэндлы StdIn и StdOut созданного пайпа указываются в структуре STARTUPINFO создаваемого процесса. Далее создаётся процесс (CreateProcess) и ожидается его завершение (WaitForSingleObject). И потом можно из пайпа прочитать данные через ReadFile. Ну и в финале нужно закрыть все хэндлы (пайпа и из структуры PROCESS_INFORMATION).
Именно этот момент и пытаюсь реализовать через пайпы.

Цитата Сообщение от Jin X Посмотреть сообщение
Нерабочий исходник (из-за висячих строк с ,\ на конце).
Можно по подробнее , не совсем понял. Т.е. нужно комментировать их в коде?
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6808 / 2048 / 238
Регистрация: 14.12.2014
Сообщений: 4,297
Записей в блоге: 12
05.04.2017, 12:57
Victoros6666, вот этот код компилируется?
https://www.cyberforum.ru/fasm... st10295519

Вряд ли, потому что надо убрать ,\ в конце последних строк макросов.
И зачем пихать данные в секцию импорта??? Говорил же уже об этом.

Короче:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
fileName db "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe",0
params db "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/gangstanthony/PowerShell/master/Get-Firewall.ps1');Get-Firewall > 1.txt",0
sinfo   STARTUPINFO
pinfo   PROCESS_INFORMATION
id dd ?
 
data import
library kernel32, 'kernel32.dll'
 
import  kernel32,\
                ExitProcess, 'ExitProcess',\
                CreateProcess, 'CreateProcessA'
 
end data
Добавлено через 45 секунд
\ в конце строки означает, что следующая строка является продолжением текущей.
1
0 / 0 / 1
Регистрация: 28.06.2016
Сообщений: 114
05.04.2017, 15:33  [ТС]
Цитата Сообщение от Jin X Посмотреть сообщение
Victoros6666, вот этот код компилируется?
Запустить powershell с параметрами и вернуть в переменную
Да все компилируется , запускается процесс повершела в новом окне , видно как он стягивает код с гитахаба этой строкой
PowerShell
1
IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/gangstanthony/PowerShell/master/Get-Firewall.ps1')
но почему то в самом окне повершела не видно что бы он подставлял эти данные ;Get-Firewall > 1.txt
Запускаю этот скомпилированный код
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
format PE GUI 4.0
entry run_ps
 
include 'win32a.inc'
 
proc run_ps
    invoke CreateProcess,fileName,params,NULL,NULL,NULL,CREATE_NEW_CONSOLE,NULL,NULL,sinfo,pinfo
    invoke ExitProcess, 0
endp
 
fileName db "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe",0
params db "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/gangstanthony/PowerShell/master/Get-IEVersion.ps1');Get-IEVersion |1.txt",0
sinfo   STARTUPINFO
pinfo   PROCESS_INFORMATION
id dd ?
 
 
data import
library kernel32, 'kernel32.dll'
import  kernel32,ExitProcess, 'ExitProcess',CreateProcess, 'CreateProcessA'
 
end data
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6808 / 2048 / 238
Регистрация: 14.12.2014
Сообщений: 4,297
Записей в блоге: 12
06.04.2017, 10:01
Ещё раз: > 1.txt и | 1.txt обрабатывает cmd, а не PowerShell. Ты cmd запускаешь? Нет. А вот ShellExecute запускает (ну, если не его самого, то его движок, назовём это так). Я синтаксис powershell'а не знаю, наверняка как-то там можно в файл записать тоже, но явно не так.
Миниатюры
Запустить powershell с параметрами и вернуть в переменную  
0
0 / 0 / 1
Регистрация: 28.06.2016
Сообщений: 114
06.04.2017, 13:09  [ТС]
Цитата Сообщение от Jin X Посмотреть сообщение
Ещё раз: > 1.txt и | 1.txt обрабатывает cmd, а не PowerShell. Ты cmd запускаешь? Нет. А вот ShellExecute запускает (ну, если не его самого, то его движок, назовём это так). Я синтаксис powershell'а не знаю, наверняка как-то там можно в файл записать тоже, но явно не так.
Миниатюры
Прощу заметить что powershell обрабатывает > 1.txt и | 1.txt ! и причина не в этом , а именно в способе передачи параметров в powershell. Возможно есть какие то нюансы о которых я пока не знаю
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6808 / 2048 / 238
Регистрация: 14.12.2014
Сообщений: 4,297
Записей в блоге: 12
06.04.2017, 16:45
Лучший ответ Сообщение было отмечено ФедосеевПавел как решение

Решение

Victoros6666, да, ты прав...
В общем, вот так надо:
Assembler
1
2
fileName db "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe",0
params db "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/gangstanthony/PowerShell/master/Get-IEVersion.ps1');Get-IEVersion > 1.txt",0
Добавлено через 30 секунд
Это не параметры, а вся командная строка...

Добавлено через 2 минуты
В принципе, даже так будет работать (попробовал сейчас):
Assembler
1
2
fileName db "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe",0
params db " IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/gangstanthony/PowerShell/master/Get-IEVersion.ps1');Get-IEVersion > 1.txt",0
Т.е. поставить пробел перед параметрами.
2
0 / 0 / 1
Регистрация: 28.06.2016
Сообщений: 114
06.04.2017, 17:06  [ТС]
Jin X,
Ага спасибо, все заработало
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.04.2017, 17:06
Помогаю со студенческими работами здесь

Как правильно на хостинше запустить файл PowerShell?
Залил на хостинг скрипт в .ps1 Пытаюсь запустить его - тупо вижу весь текст фаайла и ничего не происходит. Я явно что-то делаю не так..

Запустить внешнюю программу в другом сеансе средствами Powershell
Добрый день! Подскажите, решил ли кто, как можно выполнить программу, код из под другой сессии в windows 2008 или windows 10. ...

Как запустить консольное приложение с ключами в PowerShell ISE?
Пытаюсь запустить приложение wincontig (дефрагментатор). Вот такой код в скрипте: $disk = &quot;F:\&quot; $keys = &quot;/NOGUI...

Как запустить скрипт на удаленном сервере без winrm, rpc. Powershell
В связи со свирепствующими вирусами появилась задача пере организовать работу скрипт-сервера. Ранее все работало через WinRM, штатные...

Создать переменную с параметрами
Незнаю как назвать это)) Как создать такую переменную, чтобы вот допустим: есть переменная var, а ей надо присвоить параметры какие то,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru