Lazarus. CreateProcess. cmd. окружение

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Lazarus. CreateProcess. cmd. окружение

Сообщение Voltag » 11.12.2017 04:52:50

Здравствуйте Уважаемые!

Я не уверен, что это вопрос будет в нужной теме, простите меня, если что =). Я пишу программу для Windows в которой мне надо выполнять некоторые вызовы через коммандную строку.

Проблема проста:
Если я, из программы, порождаю консоль и пытаюсь выполнить
Код: Выделить всё
cmd /k pnputil
"pnputil" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

Программа и консоль выполняются от сис.админа. Я побродил в консоли(которую я вызвал программно) перешёл в папку C:/Windows/System32 и руками попытался вызвать pnputil.exe(он там лежит) я получил то же самое. Т.е. мне говорят, что файла нет!!??
Замечу, что к примеру команда ping в порождённой консоли работает, а нужная мне команда pnputil нет.

Естественно всё работает(утилита находиться и исполняется), если я просто(руками, НЕ из программы) вызываю консоль.

Вызов консоли я делал через TProcess, CreateProcess и ShellExecuteExW (пробовал разными способами)
У меня 32 битный лазарус на win10(64).
lazarus ver. 1.6.2 fpc 3.0.0

Вот к примеру вырезка кода вызова на TProcess:
Код: Выделить всё
procedure TForm1.processexecute(exepath,params: string);
var Process: TProcess;
begin
  Process := TProcess.Create(nil);
  try
    Process.Executable := exepath;
    Process.Parameters.Add(params);
    Process.Options := Process.Options + [poWaitOnExit];
    Process.Execute;
  finally
    Process.Free;
  end;
end;     

processexecute('c:\Windows\System32\cmd.exe','/k pnputil');



Я почитал, если в виндовс создаются процессы им можно присваиваются какие-то секьюрити_токены. Не знаю уже что делать.
Права я проверил,хотя мне бы сказали, что "не хватает прав".

Помогите, подскажите куда копать, вдруг кто сталкивался с такой проблемой
Voltag
новенький
 
Сообщения: 29
Зарегистрирован: 02.04.2008 03:49:33

Re: Lazarus. CreateProcess. cmd. окружение

Сообщение Снег Север » 11.12.2017 07:45:24

Попробуйте указывать полный путь при вызове консольной программы. Также в винде есть подпрограммы, которые дают путь к системным каталогам, чтобы не морочиться.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3033
Зарегистрирован: 27.11.2007 16:14:47

Re: Lazarus. CreateProcess. cmd. окружение

Сообщение Vadim » 11.12.2017 14:00:22

Voltag писал(а):на win10(64)

А эта весьма продвинутая штука не может блокировать запуск подпроцессов? Или, например, Ваш антивирь? Фактически Вы одну программу маскируете другой, именно так поступают вирусы. Может Вашу программу принимают за вирус и просто не дают запускать подпроцессы?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Lazarus. CreateProcess. cmd. окружение

Сообщение Voltag » 11.12.2017 15:27:42

to Снег Север
Снег Север писал(а):Попробуйте указывать полный путь при вызове консольной программы. Также в винде есть подпрограммы, которые дают путь к системным каталогам, чтобы не морочиться.

Я в самом начале ещё пробовал указывать полный путь. Я предполагал, что возможно слетели переменные окружения PATH. Поэтому я в порождённой консоли руками пытался достучаться до pnputil, и у меня не получилось, это всё описано сверху. Или возможно я Вас не понял. По поводу подпрограмм погуглю, спасибо за совет.

to Vadim
Vadim писал(а):
Voltag писал(а):на win10(64)

А эта весьма продвинутая штука не может блокировать запуск подпроцессов? Или, например, Ваш антивирь? Фактически Вы одну программу маскируете другой, именно так поступают вирусы. Может Вашу программу принимают за вирус и просто не дают запускать подпроцессы?

Теоретически "штука" может всё, но она должна (хотя не факт, но версия всё таки 10ая) была мне написать что-то типа "Нет прав" или "Ошибка бла бла", но говорить мне что файла нет, когда он есть ... это слишком.
Антивирус я вырубаю на время работы (хотя, я не помню когда я его включал обратно). По поводу маскировки, я из одной программы вызываю другую (командную строку), и жду завершения - это нормально, представьте что Вам понадобился калькулятор в бухгалтерском пакете, вызов calc будет самым быстрым решением, но возможно не самым лучшим из соображений юзабилити(к примеру вам интерфейс не подходит и т. д.). Задача моей программы - удалить старые установленные драйверы(их может быть несколько) и установить нужный драйвер, и надо сделать это "правильно". Я сделал её уже в формате bat, но я хочу, чтобы было всё красиво =)

to Снег Север, Vadim
Спасибо за советы


Единственное, что пришло мне в голову это порыть WinAPI и поискать функции установки драйверов, они там есть, ведь pnputil как то работает =). Но проблему с консолью я не решил.
Последний раз редактировалось Voltag 11.12.2017 22:08:12, всего редактировалось 1 раз.
Voltag
новенький
 
Сообщения: 29
Зарегистрирован: 02.04.2008 03:49:33

Re: Lazarus. CreateProcess. cmd. окружение

Сообщение Vadim » 11.12.2017 16:39:00

Voltag писал(а):Программа и консоль выполняются от сис.админа.

Имеется в виду - локальный администратор? Т.е. если компьютер называется "supercomp", то "supercomp\Администратор"?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Lazarus. CreateProcess. cmd. окружение

Сообщение Sergei I. Gorelkin » 11.12.2017 16:48:32

То, что для 32-битных программ отдается как каталог c:\windows\system32 - на самом деле c:\windows\syswow64, и там действительно нет pnputil.exe.
Лечится вызовами Wow64DisableWow64FsRedirection и (если надо обратно) Wow64RevertWow64FsRedirection.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Lazarus. CreateProcess. cmd. окружение

Сообщение Voltag » 11.12.2017 22:03:14

to Vadim
Пользователь под которым я сижу является Локальным Администратором, Lazarus запускается от имени администратора. Заголовок консоли "Администратор ..."

to All
В общем решение кодом такое:
Код: Выделить всё
  function Wow64DisableWow64FsRedirection(x:Pointer):boolean; stdcall; external 'Kernel32.dll' name 'Wow64DisableWow64FsRedirection';
  function Wow64RevertWow64FsRedirection(x:boolean):boolean; stdcall; external 'Kernel32.dll' name 'Wow64RevertWow64FsRedirection';

Не советуют держать Disable долго, я не разбирался почему, но так пишут...

Огромное спасибо всем за интерес к моей проблеме, спасибо за ответы!
Отдельное спасибо Sergei I. Gorelkin за решение
Voltag
новенький
 
Сообщения: 29
Зарегистрирован: 02.04.2008 03:49:33

Re: Lazarus. CreateProcess. cmd. окружение

Сообщение BIT » 15.01.2018 19:00:55

Возможно вам это поможет?
Код: Выделить всё

  P := TProcessUTF8.Create(nil);

  P.Executable := 'cmd';
  P.Parameters.Clear;
  P.Parameters.Add('/c');
  P.Parameters.Add('cd ' +Путь до папки файла +' & start имя файла');
  P.Execute;                 
Аватара пользователя
BIT
новенький
 
Сообщения: 25
Зарегистрирован: 29.12.2017 15:44:58


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 6

Рейтинг@Mail.ru