Пакетный сценарий для однократного запуска программы с помощью администратора запуска и немедленного закрытия

Я разработал обходной путь для устаревшего программного обеспечения WinXP (код / ​​проект недоступен, он очень старый!), Который позволяет ему работать в Windows 10. Обходной путь по существу состоит из установки сценария Inno, который: 1) Запускает установщик XP программного обеспечения (запрашивает admin), и 2) Запускает пакетный файл для копирования файлов "comctl32.dll / .ocx" в Windows / SysWOW64.

Намерение состоит в том, чтобы запустить этот установщик на клиентских компьютерах в автоматическом режиме, и установка / копирование файлов в порядке, но моя основная проблема заключается в том, что установленные программы должны быть запущены от имени администратора хотя бы один раз, чтобы впоследствии работать локальный администратор и обычные пользователи.

введите описание изображения здесь

Итак, в настоящее время мой тихий установщик / пакет делает все нормально, но мне все равно нужно щелкнуть правой кнопкой мыши все эти программы и один раз выполнить Запуск от имени администратора (что противоречит цели создания этого установщика / сценария, если мне придется делать это со всеми моими машинами! ). Итак, я думаю, что мне нужно добавить в свой пакетный файл для запуска программы (от имени администратора), а затем принудительно закрыть.

Есть предложения о том, как я могу написать это? К вашему сведению, я подумал о "nircmd", но думаю, что наши сканеры отметили его, и он исчез с моего ПК, прежде чем я смог попробовать что-нибудь с ним. ^ _ ^

Учетные записи пользователей этих компьютеров всегда имеют значение «локальный администратор», но не более высокий уровень администратора. Я действительно не знаю, что происходит в фоновом режиме, когда программы запускаются с запуском от имени администратора (я упоминал об отсутствии доступа к коду / проекту? ^ _ ^)

Вот пакетный файл, который я написал, который запускается после этого установщика XP. По сути, это копирует часть этого дополнительного файла обходного пути и пытается запустить программу, а затем - taskkill ... Как вы думаете, это движется в правильном направлении?

    ECHO
    TITLE "C Win10 Installer"
    COPY "c:\temp\Cwin10\Cicon.ico" "C:\Program Files (x86)\ABC\Cfolder\C.ico"
    COPY "c:\temp\Cwin10\comctl32.dll" "C:\Program Files (x86)\ABC\Cfolder\comctl32.dll"
    COPY "c:\temp\Cwin10\comctl32.ocx" "C:\Program Files (x86)\ABC\Cfolder\\comctl32.ocx"
    COPY "c:\temp\Cwin10\CDM20830_Setup.exe" "C:\Program Files (x86)\ABC\Cfolder"
    XCOPY "c:\temp\Cwin10\ref" "C:\Program Files (x86)\ABC\Cfolder\ref" /i /s
    COPY "C:\Program Files (x86)\ABC\Cfolder\Strip.ocx" "C:\Program Files (x86)\ABC\Cfolder\app\Strip.ocx"
    RUNAS /env /user:Administrator "C:\Program Files (x86)\ABC\Cfolder\app\App.exe"
    TASKKILL /F /im App.exe
    DEL "C:\temp\Cwin10\Cicon.ico"
    set folder="C:\temp\Cwin10"
    cd /d %folder%
    for /F "delims=" %%i in ('dir /b') do (rmdir "%%i" /s/q || del "%%i" /s/q)

Также к вашему сведению, я добавил это в начало моей партии Как я могу автоматически повысить уровень своего командного файла, чтобы он запрашивал права администратора UAC, если это необходимо?


ОБНОВЛЕНИЕ: изменено, чтобы вместо этого регистрировать библиотеки DLL в INNO, вот где я сейчас нахожусь. Я использую обходной путь ярлыка, чтобы запустить приложение от имени администратора один раз, поэтому последующие запуски будут работать ... однако я хочу TASKKILL, чтобы он запускался в течение короткой секунды и немедленно закрывался, а затем запускал следующие два приложения.

Однако на самом деле он запускает приложение и ничего не делает. Когда закрываю, то приходит TASKKILL и не может найти запущенный процесс. Есть предложения, как ЗАПУСТИТЬ, а затем TASKKILL за одну секунду?

ECHO
TITLE "C Win10 Installer"
"C:\temp\Cwin10\BexeShortcut.lnk"
TASKKILL /F /im B.exe
"C:\temp\Cwin10\EexeShortcut.lnk"
TASKKILL /F /im E.exe
"C:\temp\Cwin10\Cexe.lnk"
TASKKILL /F /im Cexe.exe
set folder="C:\temp\Cwin10"
cd /d %folder%
for /F "delims=" %%i in ('dir /b') do (rmdir "%%i" /s/q || del "%%i" /s/q)

person joshjayse    schedule 27.07.2017    source источник
comment
Чтобы использовать RUNAS в пакетном файле, вам необходимо знать пароль администратора и указать его в той же строке. Я считаю, что если вы выполняете запуск от имени администратора в самой программе INNO, тогда программа INNO запускается от имени администратора, а все программы, которые запускаются из установщика INNO, по умолчанию запускаются от имени CurrentUser, который будет администратором. Таким образом, вам не нужно использовать RUNAS в командном файле.   -  person thx1138v2    schedule 27.07.2017
comment
Я вижу некоторые проблемы в вашем командном файле. Вы не регистрируете библиотеки DLL. INNO может делать все, что вы делаете в пакетном файле, а также регистрировать библиотеки DLL.   -  person thx1138v2    schedule 27.07.2017
comment
Спасибо, я исправил DLL и добавил в строку [FILES] INNO. Что касается 'кода' RUNAS / env / user: Administrator C: \ Program Files (x86) \ ABC \ Cfolder \ app \ App.exe 'code', поэтому я запускаю пакетный файл как текущий пользователь 'code' Имя файла: c : \ темп \ Cwin10 \ cleanup.bat; StatusMsg: Копирование дополнительных файлов ...; Флаги: hidewizard runascurrentuser waituntilterminated 'code' ... Я заметил в CMD в режиме администратора, он запрашивает пароль ... Я не могу запустить его, даже используя RUNAS / env C: \ Program Files (x86) \ ABC \ Cfolder \ app \ App.exe. Мысли?   -  person joshjayse    schedule 27.07.2017
comment
@ thx1138v2, не обращайте внимания на эту верхнюю часть ... Я только что понял, как с помощью cmd запустить ярлык с помощью Run As Admin ... но программа запускается, и я хочу немедленно закрыть. По какой причине TASKKILL не работает? Кажется, что он запускается только после того, как я закрываю App.exe, который в этот момент является избыточным. Я просто хочу запустить файл один раз на короткую секунду (чтобы сохранить запуск от имени администратора) и немедленно закрыть.   -  person joshjayse    schedule 28.07.2017
comment
Я предполагаю, что App.exe требуется немного времени для полной загрузки и инициализации. Предполагая, что вы используете пакетный файл для запуска App.exe, поместите команду TIMEOUT между строкой вызова App.exe и строкой TaskKill.   -  person thx1138v2    schedule 28.07.2017
comment
Вы также можете использовать START в пакетном файле для запуска App.exe. Параметр / B команды START запустит ее без нового окна, и она будет работать, не дожидаясь завершения работы App.exe. Таким образом, он немедленно приступит к обработке строки партии TIMEOUT. Возможно, вам придется поиграть с задержкой TIMEOUT, чтобы дать ей достаточно времени для инициализации. Имейте в виду, что если вы используете переключатель / B, вам нужно будет убить App.exe с помощью диспетчера задач во время отладки.   -  person thx1138v2    schedule 28.07.2017
comment
@ thx1138v2, НАЧАТЬ с / b действительно работает! У меня действительно была икота, потому что я указывал в «коде» START / B «код» c: \ --- \ app.exe, и приложение не запускалось. но потом я просто перешел на START / b APP.EXE и отлично работает! таймаут не нужен, но START / B определенно решил эту проблему! спасибо, сэр! P.S ... если вы скопируете / вставите ответ в качестве ответа, я обязательно дам вам реквизит / кредит.   -  person joshjayse    schedule 28.07.2017


Ответы (1)


В пакетном файле:

START "" /B App.exe
TIMEOUT /t 1
TASKKILL /F /IM App.exe

Спасибо.

person thx1138v2    schedule 28.07.2017