Войти

Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 9]


Страниц : 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 46 47 48 49 50 51 52 53 54 55 56 57

AnastasiyaM
20-10-2018, 16:45
Ребята, помогите, пожалуйста.
Есть задача, при установке программы создавать нового пользователя windows и добавлять программу в автозагрузку только ему (во время установки программы но не является текущим пользователем.) Пробовала получать SID пользователя после создания, но видимо из-за нехватки опыта получается какая-то ерунда. Выкладываю свои попытки, может подскажете как можно поправить?


[Registry]
Root: HKU; Subkey: {code:GetUserSid}\Software\Microsoft\Windows\CurrentVersion\Run; ValueName: {#MyAppExeName}; ValueType: string; ValueData: {app}\{#MyAppExeName};

[Run]
; здесь я создаю пользователя и пыталась сделать его загружаемым по умлочания после перезагрузки, но пока точно работает только первая строчка :)
Filename: net.exe; parameters: "user Visitor /add /fullname:""Visitor"" /comment:""TEST"" /expires:never /passwordchg:no"
Filename: reg.exe; parameters: "ADD HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon /v AutoAdminLogon /t REG_SZ /d 1";
Filename: reg.exe; parameters: "ADD HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon /v DefaultUserName /t REG_SZ /d 'Visitor'";
[Code]
function GetUserSid(ExecStdout: string):string;
var
TmpFileName: string;
ResultCode: integer;
Params: string;

begin
TmpFileName := ExpandConstant('{tmp}') + '\sid_results.txt';
Exec(ExpandConstant('{cmd}'), ' /C wmic useraccount where name=''Visitor'' get sid > "' + TmpFileName + '"', '', SW_SHOW, ewWaitUntilTerminated, ResultCode);
if LoadStringFromFile(TmpFileName, ExecStdout) then
begin
MsgBox(ExecStdout, mbInformation, MB_OK);
end
else
begin
MsgBox('Installing Error', mbError, MB_OK);
end;
DeleteFile(TmpFileName);
end;

Chudmin
21-10-2018, 22:26
Здравствуйте!
Подскажите пожалуйста, как реализовать, чтобы при запуске инсталятора, например, "Моя_прога", если запущена уже ранее установленная программа "Моя_прога.exe", то сразу же, без вопросов, "Моя_прога.exe" закрывалась?

Iska
21-10-2018, 23:00
Chudmin, вообще-то, в этом случае инсталлятор не должен «сразу же, без вопросов» закрываться.

Chudmin
22-10-2018, 05:44
в этом случае инсталлятор не должен «сразу же, без вопросов» закрываться. »
Вы не правильно меня поняли. Есть программа "Моя_прога" и есть инсталятор к ней "Моя_прога_Setup", так вот, если у пользователя уже установлена "Моя_прога" и запущена, а в это время он запускает (при работающей "Моя_прога") инсталятор "Моя_прога_Setup", то инсталятор сразу же, "молчком", закрывает программу "Моя_прога".

Iska
22-10-2018, 05:46
Chudmin, и этого быть не должно (разве что «Моя_прога» — это сервис).

Chudmin
22-10-2018, 06:01
и этого быть не должно »
Ну, должно или не должно, это другой вопрос, главное что такое работает, например в репаках уважаемого Elchupacabra.

ErikPshat
22-10-2018, 06:39
Chudmin,
[UninstallRun]
Filename: "{sys}\taskkill.exe"; Parameters: "/f /im Моя_прога.exe"; Flags: skipifdoesntexist runhidden
или использовать сразу в секции Files параметр BeforeInstall для уничтожения процесса перед установкой:
[Files]
Source: "Моя_прога.exe"; DestDir: "{app}"; Flags: ignoreversion; BeforeInstall: TaskKill('Моя_прога.exe')

[ Code ]
procedure TaskKill(FileName: String);
var
ResultCode: Integer;
begin
Exec(ExpandConstant('taskkill.exe'), '/f /im ' + '"' + FileName + '"', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
end;

Chudmin
22-10-2018, 07:17
или использовать сразу в секции Files параметр BeforeInstall для уничтожения процесса перед установкой: »
Спасибо большое, этот метод как раз близок к моему желанию (в отличии от [UninstallRun]). Я только недавно стал вникать в тонкости Inno Setup, так-что чайник в полном смысле этого слова, а в секции [Code], так вообще на уровне скопировал, посмотрел результат, так-что Ваш пример в мою копилку, на которых (в том числе) я буду постигать азы [Code].

И всё-таки, у Elchupacabra этот процесс происходит сразу же после запуска инсталятора, КАК? Конечно и Ваш способ работает и выполняет свою функцию, но хотелось бы знать как сделать в самом начале, чисто академический интерес.

boss911
22-10-2018, 16:00
Есть программа "Моя_прога" и есть инсталятор к ней "Моя_прога_Setup", так вот, если у пользователя уже установлена "Моя_прога" и запущена, а в это время он запускает (при работающей "Моя_прога") инсталятор "Моя_прога_Setup", то инсталятор сразу же, "молчком", закрывает программу "Моя_прога". »
Предложу использовать библиотеку KillProc.dll (https://www.upload.ee/files/9100402/IS_Lib_KillProc.rar.html) для Inno Setup.
[Files]
Source: C:\MyProg\MyProg.exe; DestDir: {app}; Flags: ignoreversion; BeforeInstall: KillProc
Source: compiler:Libraries\KillProc.dll; DestDir: {tmp}; Flags: dontcopy

[Code]
function KillProcByExeName(ProcessName: PAnsiChar; ExcludeID: Cardinal): Integer; external 'KillProcByExeName@files:KillProc.dll stdcall';

procedure KillProc;
begin
KillProcByExeName('MyProg.exe', 0);
end;
Если в момент установки будет запущен процесс с именем MyProg.exe, то перед копированием файла MyProg.exe, данный процесс будет принудительно завершен. Метод старый, возможно уже есть другие решения, с проверкой ID процесса.

Правильно или не правильно, но если MyProg.exe не служба и нет ключа командной строки для завершения работы, а процесс без вопросов необходимо завершить и по другому ни как, то это единственный вариант, и уже закрываешь глаза на то, что это не правильно. ИМХО.

ErikPshat
22-10-2018, 21:21
Предложу использовать библиотеку KillProc.dll для Inno Setup. »
Не понимаю зачем, если это делается стандартными средствами. Ну может быть для кого-то это может оказаться единственно рабочим решением.

И всё-таки, у Elchupacabra этот процесс происходит сразу же после запуска инсталятора, КАК? »
Ну так всё зависит от того, когда выполняется ваш код. Сколько у вас файлов в секции [Files] и когда они запускаются?
Скорее всего ваши файлы смирно сидят в инсталляторе и терпеливо ждут, пока юзер не пройдёт все этапы, проставит галочки, там создавать ярдыки на рабочем столе, выбирает дополнения, путь установки, а тоько в заключении жмёт кнопку "Установить". Вот тогда и активируется ваша "Моя_прога.exe", а перед её запуском и начинается поиск процесса и его уничтожение.

Чтобы процесс уничтожался сразу при запуске инсталлятора, нужно чтобы у вас в [Files] был бы назначен на BeforeInstall какой-нибудь файлик, который бы извлекался в %TEMP% именно при запуске инсталлятора, а не по нажатию кнопки "Установить".

Для примера, вы можете прикрепить к инсталлятору Сплэш-заставку и заодно на неё повесить убийцу процесса:
[Files]
; Файлы Splash-заставки, загружаются первыми
Source: Include\isgsg.dll; DestDir: {tmp}; Flags: dontcopy nocompression; BeforeInstall: TaskKill('Моя_прога.exe')
Source: Include\Splash.png; DestDir: {tmp}; Flags: dontcopy nocompression
В секции [ Code ] объявляете процедуру заставки и процедуру убийцы процесса в самом начале:
[ Code ]
{ Splash заставка }
procedure ShowSplashScreen(p1:HWND;p2:AnsiString;p3,p4,p5,p6,p7:integer;p8:boolean;p9:Cardinal;p10:integer);
external 'ShowSplashScreen@files:isgsg.dll stdcall delayload';
procedure TaskKill(FileName: String);var ResultCode: Integer;begin
Exec(ExpandConstant('taskkill.exe'),'/f /im '+'"'+FileName+'"','',SW_HIDE,ewWaitUntilTerminated,ResultCode);end;

Этот код извлечения и запуска заставки вставляете в нужном вам месте. Я её разместил после всей массы программного кода в конец, но перед отрисовкой формы окна:
{ Splash заставка }
procedure Splash();
begin
ExtractTemporaryFile('Splash.png');
ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}\Splash.png'),500,800,500,0,255,True,$FFFFFF ,10);
end;
И в конце кода инициализируете её:
procedure InitializeWizard();
begin
Splash();
end;

Таким образом, при запуске программы сразу извлекаются файлы заставки в %TEMP% и запускается заставка перед стартом инсталлятора, но ещё перед этим, запускается убийца процесса, потому что на файл заставки выставлен флаг BeforeInstall.

AnastasiyaM
22-10-2018, 22:54
Есть задача, при установке программы создавать нового пользователя windows и добавлять программу в автозагрузку только ему (во время установки программы но не является текущим пользователем.) Пробовала получать SID пользователя после создания, но видимо из-за нехватки опыта получается какая-то ерунда. Выкладываю свои попытки, может подскажете как можно поправить? »
В общем, не смогла победить задачу средствами инсталлятора, сделала bat файл, который находит SID и прописывает в автозапуск программу. Теперь новая проблема. Если запускаю свой bat в новом пользователе, то он успешно отрабатывает. А если в том пользователе, под которым создаю нового, то пишет "неверный параметр". В связи с этим ломаю теперь голову над задачей:
1. установить программу
2. создать попутно нового пользователя
3. перезагрузить систему и зайти под новым пользователем
4. запустить bat файл.
И это все должен делать инсталлятор.
Видела примеры как делают продолжение установки после перезагрузки, но очень слабо понимаю, что куда там нужно вписать (
Буду очень благодарна за советы, примеры, объяснения

Iska
22-10-2018, 23:47
AnastasiyaM, в Вашем случае пользователя мало создать: у новосозданного пользователя отсутствует профиль. Просто запустите программно какое-либо приложение от имени новосозданного пользователя, дождитесь его завершения, и только затем пытайтесь что-либо делать с его разделами реестра или путями в его профиле.

AnastasiyaM
22-10-2018, 23:56
AnastasiyaM, в Вашем случае пользователя мало создать: у новосозданного пользователя отсутствует профиль. Просто запустите программно какое-либо приложение от имени новосозданного пользователя, дождитесь его завершения, и только затем пытайтесь что-либо делать с его разделами реестра или путями в его профиле. »
Большое спасибо за совет, буду копать в этом направлении!

ErikPshat
23-10-2018, 03:29
В общем, не смогла победить задачу средствами инсталлятора, сделала bat файл, который находит SID и прописывает в автозапуск программу. Теперь новая проблема. Если запускаю свой bat в новом пользователе, то он успешно отрабатывает. А если в том пользователе, под которым создаю нового, то пишет "неверный параметр". В связи с этим ломаю теперь голову над задачей: »
Это уже называется вирусописание, а не инсталлятор )))

Chudmin
23-10-2018, 08:06
Таким образом, при запуске программы сразу извлекаются файлы заставки в %TEMP% и запускается заставка перед стартом инсталлятора, но ещё перед этим, запускается убийца процесса, потому что на файл заставки выставлен флаг BeforeInstall. »
При компиляции выдаёт ошибку на строке " Splash();" - Unknown identifier 'Splash'.

ErikPshat
23-10-2018, 08:38
При компиляции выдаёт ошибку на строке " Splash();" - Unknown identifier 'Splash'. »
Ой, забыл добавить код извлечния ))) мы же 2 файла только добавилив в [Files], чтобы программа паковала их и таскала с собой. А кто извлекать файлы будет, чтобы они заработали? Они в нужный момент в нужной части кода должны извлекаться командой ExtractTemporaryFile и следом запускать отображение заставки.

Вот, нужно ещё код извлечения и активации нужно добавить в подходящее вам место:
{ Splash заставка }
procedure Splash();
begin
ExtractTemporaryFile('Splash.png');
ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}\Splash.png'),500,800,500,0,255,True,$FFFFFF ,10);
end;
Если что, DLL-ку isgsg.dll Splash-заставки залил во вложение. Картинку с прозрачностью Splash.png свою добавите.

Chudmin
23-10-2018, 09:07
Вот, нужно ещё код извлечения и активации нужно добавить в подходящее вам место: »
Спасибо за отзывчивость! Но похоже сначала мне нужно в секции "Коде" изучить азы, что за что отвечает, и как правильно это пишется, а то выходит ошибка (как и сейчас), а я вообще ничего не понимаю, от слова совсем. Не буду же по каждому пустяку просить людей, чтобы мне разжевали и в рот положили.

Дайте совет, что, где почитать в этом направлении, чтобы хоть что-то понимать?

ErikPshat
23-10-2018, 09:57
Chudmin, ну так в Inno Script Studio нажмите в меню Помощь -> Документация Inno Setup и изучайте.
Используется Pascal, простейший язык для изучения.

Я именно со справки и начинал. Когда делал свою первую программу, сутки посидел, поискал решения своих задач, так там всё и нашёл, там много примеров практически по всем направлениям, собранных по вопросам и ответам на форумах. Ну и за сутки я практически освоил все приёмы по кодингу в этой программе.
Скачайте последнюю версию русской справки: http://krinkels.org/threads/russkaja-spravka-po-inno-setup.2083/
Замените CHM в папке с программой C:\Program Files (x86)\Inno Setup 5\
Посмотрите сборник скриптов и примеров: http://krinkels.org/threads/faq-po-inno-setup.7/
Покомпилируйте готовые рабочие скрипты: http://krinkels.org/forums/skripty-dlja-inno-setup.256/
Ну и на их примере попытайтесь сделать что-нибудь своё.

Chudmin
23-10-2018, 14:01
Используется Pascal, простейший язык для изучения. »
Нашёл я свою ошибку, Splash-заставка отработала, а вот taskkill нет.

AnastasiyaM
23-10-2018, 17:18
AnastasiyaM, в Вашем случае пользователя мало создать: у новосозданного пользователя отсутствует профиль. Просто запустите программно какое-либо приложение от имени новосозданного пользователя, дождитесь его завершения, и только затем пытайтесь что-либо делать с его разделами реестра или путями в его профиле. »
Еще раз спасибо, почти получилось сотворить чудо.
Только bat файл запрашивает пароль нового пользователя, когда запускает что-то от его имени (без пароля отказывается работать). Есть ли способ, как ему его передать в инсталятор? что то вроде Filename: cmd.exe; parameters: "{app}\my.bat %pas"; ?

Это уже называется вирусописание, а не инсталлятор ))) »
не :) специфические требования :)




© OSzone.net 2001-2012