Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 9]
ErikPshat
23-10-2018, 20:10
Нашёл я свою ошибку, Splash-заставка отработала, а вот taskkill нет. »
Ну попробуйте повесить taskkill на иконку заставки или на другие файлы, которые загружаются первыми.
Вполне возможно, что команда извлечения ExtractTemporaryFile действует принудительно, в обход стандартного функционала инсталлятора и поэтому флаги из секции [Files] не отрабатывают. По-моему так и есть, флаги там работают только при стандартных действиях инсталлятора, т.е. при нажатии кнопки Install на конечном этапе. А у вас до этого не доходит и вы вызываете Taskkill до запуска инсталлятора из секции [ Code ] программы.
Поэтому нужно искать другое решение, т.е. как-то вызывать taskkill из кода программы, либо подключать библиотеку taskkill.dll или KillProc.dll и вызывать его через [external 'KillProcByExeName@files:KillProc.dll stdcall], как недавно выкладывал код boss911
здесь: http://forum.oszone.net/thread-334142-11.html#post_message_2836987
здесь: http://forum.oszone.net/thread-334142-11.html#edit2836987
здесь: http://forum.oszone.net/thread-334142-11.html#post2836987
Поэтому нужно искать другое решение, т.е. как-то вызывать taskkill из кода программы, либо подключать библиотеку taskkill.dll или KillProc.dll и вызывать его через [external 'KillProcByExeName@files:KillProc.dll stdcall], как недавно выкладывал код boss911 здесь: http://forum.oszone.net/thread-33414...essage_2836987 »
Да, буду думать-экспериментировать.
Только bat файл запрашивает пароль нового пользователя, когда запускает что-то от его имени (без пароля отказывается работать). Есть ли способ, как ему его передать в инсталятор? »
Это Вам надо «местных» коллег, специалистов по InnoSetup Pascal Scripting, озадачить данным вопросом, дабы подсказали.
ErikPshat
23-10-2018, 22:09
Только bat файл запрашивает пароль нового пользователя, когда запускает что-то от его имени (без пароля отказывается работать). Есть ли способ, как ему его передать в инсталятор? что то вроде Filename: cmd.exe; parameters: "{app}\my.bat %pas"; ? »
Скорее всего созданный пользователь не является Администратором и не имеет прав. Вам нужно нового пользователя назначить Администратором компьютера. Может быть как-то так получится:
@echo Добавление нового пользователя
@echo off
set user_name=Vasia_Pupkin
set user_passw=12345678
echo.
echo 1. Добавление нового пользователя
net user %user_name% %user_passw% /add /expires:never /fullname:%user_name%
echo.
echo 2. Обновление свойств пользователя
echo.
wmic path UserAccount where "Name='%user_name%'" set PasswordExpires=false /nointeractive
echo.
echo 3. Добавление в группу "Администраторы" и удаление из "Пользователя"
net localgroup "Администраторы" %user_name% /add
net localgroup "Пользователи" %user_name% /delete
@pause
ErikPshat, чего, кого?
Скорее всего созданный пользователь не является Администратором и не имеет прав. »
И не должен являться. Этого не требуется ни по условию техзадания, ни для реализации.
Вам нужно нового пользователя назначить Администратором компьютера. »
Не нужно. Совсем. И этого не требуется ни по условию техзадания, ни для реализации.
Нужно: реализация на InnoSetup Pascal Scripting функции CreateProcessAsUser/CreateProcessWithLogon.
ErikPshat
23-10-2018, 22:41
Iska, ну я написал код батника, можно всё перенести в код Inno Setup.
А почему тогда, при создании нового пользователя, после запуска батника, требует ввод пароля?
Потому что созданный пользователь является просто Гостем и для него всегда будет запршиваться пароль.
AnastasiyaM
23-10-2018, 23:16
Iska, ну я написал код батника, можно всё перенести в код Inno Setup.
А почему тогда, при создании нового пользователя, после запуска батника, требует ввод пароля?
Потому что созданный пользователь является просто Гостем и для него всегда будет запршиваться пароль. »
Iska прав, задача создать пользователя и прописать ему ключи в реестр. Но так как у нового пользователь нет профиля, пока в него никто не логинился, я пытаюсь запустить от его имени какой-то процесс. Пароль просит именно нового пользователя. Если создавать пользователя без пароля, то ranas команда вообще отказывается работать :(
ErikPshat
24-10-2018, 00:28
AnastasiyaM, ну так я что-то недогоняю. Я же вам и предложил код, который:
1. Создаёт нового пользователя с Именем и Паролем.
2. Настраивает пользователя, т.е. ставит галочку, что Пароль не временный, а "Срок действия пароля не ограничен".
3. Делает пользователя Админом и даёт права на выполнение действий без ввода пароля.
Теперь вы можете от его имени запускать необходимые процессы, без запроса пароля.
И команду ranas можете выполнять.
AnastasiyaM
24-10-2018, 01:17
ErikPshat, нужен обязательно бесправный пользователь.
3. Делает пользователя Админом и даёт права на выполнение действий без ввода пароля. »
Даже если он еще никогда не логинился? Я попробовала вставить Ваш код, он все равно пароль запросил и я пошла искать другие способы. Может что-то не так сделала..
Я пока сделала такой костыль в секции
[Code]
Exec(ExpandConstant('runas'), ' /user:MyUser cmd.exe', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ErrorCode);
теперь во время установки сообщение командной строки с запросом пароля появляется на экране. Не идеально, но работает :)
El Sanchez
24-10-2018, 12:36
AnastasiyaM, вам нужно создавать пользователя уже с паролем, иначе на первом же логоне система скажет ни-ни, потом создать профиль и получить SID. Вот пример без автологона и с требованием пароля при первом входе. Пароль и прочие настройки вам все равно придется в учетке пользователя делать.
[Registry]
#define UserName "Visitor"
Root: HKU; Subkey: {code:GetUserSid|{#UserName}}\Software\Microsoft\Windows\CurrentVersion\Run; ValueName: {#MyAppExeName}; ValueType: string; ValueData: {app}\{#MyAppExeName}; Check: CheckCreateUser('{#UserName}')
[Code]
#define A = (Defined UNICODE) ? "W" : "A"
const
ERROR_SUCCESS = 0;
ERROR_INSUFFICIENT_BUFFER = 122;
LOGON32_LOGON_INTERACTIVE = 2;
LOGON32_PROVIDER_DEFAULT = 0;
type
TProfileInfo = record
dwSize: DWORD;
dwFlags: DWORD;
lpUserName: string;
lpProfilePath: string;
lpDefaultPath: string;
lpServerName: string;
lpPolicyPath: string;
hProfile: THandle;
end;
function LookupAccountName(lpSystemName, lpAccountName: string;
var Sid: Byte; var cbSid: DWORD; ReferencedDomainName: string;
var cbReferencedDomainName: DWORD; var peUse: LongWord): BOOL; external 'LookupAccountName{#A}@advapi32.dll stdcall';
function ConvertSidToStringSid(var Sid: Byte; var StringSid: LongWord): BOOL; external 'ConvertSidToStringSid{#A}@advapi32.dll stdcall';
function LogonUser(lpszUsername, lpszDomain, lpszPassword: string;
dwLogonType, dwLogonProvider: DWORD; var phToken: THandle): BOOL; external 'LogonUser{#A}@advapi32.dll stdcall';
function LoadUserProfile(hToken: THandle; var lpProfileInfo: TProfileInfo): BOOL; external 'LoadUserProfile{#A}@userenv.dll stdcall';
function UnloadUserProfile(hToken, hProfile: THandle): BOOL; external 'UnloadUserProfile@userenv.dll stdcall';
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function CheckCreateUser(const UserName: string): Boolean;
var
TempPassword: string;
UserToken: THandle;
ProfileInfo: TProfileInfo;
ResultCode: Integer;
begin
Result := False;
try
{ Create user account. }
TempPassword := 'PqYDLMAD';
if not Exec(ExpandConstant('{cmd}'), Format('/c net user "%s" "%s" /add /expires:never', [UserName, TempPassword]), '', SW_HIDE, ewWaitUntilTerminated, ResultCode) or
(ResultCode <> ERROR_SUCCESS) then Exit;
{ Create user profile. }
if not LogonUser(UserName, '.', TempPassword, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, UserToken) then
RaiseException(SysErrorMessage(DLLGetLastError));
ProfileInfo.dwSize := SizeOf(ProfileInfo);
ProfileInfo.lpUserName := UserName;
if not LoadUserProfile(UserToken, ProfileInfo) and
not UnloadUserProfile(UserToken, ProfileInfo.hProfile) then
RaiseException(SysErrorMessage(DLLGetLastError));
{ Change user account. }
if not Exec(ExpandConstant('{cmd}'), Format('/c net user "%s" "" /logonpasswordchg:yes', [UserName]), '', SW_HIDE, ewWaitUntilTerminated, ResultCode) or
(ResultCode <> ERROR_SUCCESS) then Exit;
Result := True;
except
ShowExceptionMessage;
finally
if UserToken <> 0 then
CloseHandle(UserToken);
end;
end;
function GetUserSid(const UserName: string): string;
var
Sid: array of Byte;
DomainName: string;
SidSize, DomainNameSize: DWORD;
Buffer: LongWord;
begin
Result := '';
try
SetArrayLength(Sid, 1);
if not LookupAccountName('', UserName, Sid[0], SidSize, '', DomainNameSize, Buffer) and
BOOL(DLLGetLastError <> ERROR_INSUFFICIENT_BUFFER) then Exit;
SetArrayLength(Sid, SidSize);
DomainName := StringOfChar(#0, DomainNameSize - 1);
if not LookupAccountName('', UserName, Sid[0], SidSize, DomainName, DomainNameSize, Buffer) and
BOOL(DLLGetLastError <> ERROR_SUCCESS) then
RaiseException(SysErrorMessage(DLLGetLastError));
if not ConvertSidToStringSid(Sid[0], Buffer) then
RaiseException(SysErrorMessage(DLLGetLastError));
Result := CastIntegerToString(Buffer);
except
ShowExceptionMessage;
finally
end;
end;
флаги там работают только при стандартных действиях инсталлятора, т.е. при нажатии кнопки Install на конечном этапе. А у вас до этого не доходит и вы вызываете Taskkill до запуска инсталлятора из секции [ Code ] программы. »
Похоже так и есть - я прикрутил скин, файлы скина делал через Темп, без копирования и с копированием в {app}, с флагом BeforeInstall - TaskKill не отрабатывал, а вот при установке отрабатывает.
AnastasiyaM
24-10-2018, 14:36
Вот пример без автологона и с требованием пароля при первом входе. Пароль и прочие настройки вам все равно придется в учетке пользователя делать. »
Это очень круто! Спасибо вам большое за помощь! Я бы такую красоту в жизни не написала :yahoo:
pollipen
28-10-2018, 20:37
Парни скажите как сделать средствами Inno Setup
короче при распаковки инстал. запускается другой с папки tmp, но он запаролен скажем 12345
так вот как мне сделать что бы он автоматом запускался без вода в ручную пароля
так вот как мне сделать что бы он автоматом запускался без вода в ручную пароля »
Inno Setup command line - Поиск в Google (https://www.google.com/search?q=Inno+Setup+command+line&ie=utf-8&oe=utf-8) → Setup Command Line Parameters (http://www.jrsoftware.org/ishelp/topic_setupcmdline.htm):
/PASSWORD=password
Specifies the password to use. If the [Setup] section directive Password was not set, this command line parameter is ignored.
When an invalid password is specified, this command line parameter is also ignored.
pollipen
29-10-2018, 11:40
что то ни как ни пойму
wwwww.exe он запаролен
#define MyAppName "My Program"
#define MyAppVersion "1.5"
#define MyAppPublisher "My Company, Inc."
#define MyAppURL "http://www.example.com/"
#define MyAppExeName "MyProg.exe"
[Setup]
AppId={{4F1F4C94-0955-42AB-9AEF-23D33908F46C}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes
[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"
[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
[Files]
Source: "C:\Program Files (x86)\Inno Setup 5\Examples\MyProg.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\ww\Desktop\wwwww.exe"; DestDir: "{tmp}"; Flags: ignoreversion
[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
[Run]
Filename: "{tmp}\wwwww.exe"; Parameters: "/PASSWORD=12345"
ErikPshat
29-10-2018, 17:41
pollipen, чёт мне показалось, что речь шла про секцию [Setup], а не про [RUN].
Хотя и в секции [ Code ] любые параметры запуска приложения имеют возможность выставить параметры запуска.
pollipen
30-10-2018, 11:44
ErikPshat
хорошо тогда как через [ Code ]
ErikPshat
30-10-2018, 13:52
pollipen, ну как мы запускаем любые экзешники через "ShellExec" или "Exec". Там на втором месте указываются параметры к экзешнику.
Вот пример извлечения запароленных архивов 7-Zip:
; Дефайним переменные
#define Name "My_Program_Name"
#define UserName "by pollipen"
#define Version "1.0.0.0"
#define Publisher "pollipen © OsZone Team"
#define ExeName "My_Program_Name"
;
; Точка с запятой - это комментарий
;
; Выставляем стандартные параметры программы в секции Setup:
[Setup]
;VersionInfoCompany=Название компании
VersionInfoCompany={#Publisher}
;VersionInfoCopyright=Авторские права
VersionInfoCopyright=(c) 2006-2018 {#Publisher}
;VersionInfoDescription=Описание файла
VersionInfoDescription={#Name} {#UserName}
;VersionInfoProductName=Название продукта
VersionInfoProductName={#Name}
;VersionInfoProductVersion=1.0.0.0 (Версия продукта цифровая)
VersionInfoProductVersion={#Version}
;VersionInfoProductTextVersion=Производитель
VersionInfoProductTextVersion={#Publisher}
;VersionInfoTextVersion=Версия файла текстовая
VersionInfoTextVersion={#Version} Final
;VersionInfoVersion=1.0.0.0 (Версия файла цифровая)
VersionInfoVersion={#Version}
;
; Таскаем (пакуем) с собой экзешник и INI (для примера) в программе:
[Files]
Source: Include\7z.exe; DestDir: {tmp}; Flags: dontcopy
Source: Include\7z.dll; DestDir: {tmp}; Flags: dontcopy
Source: Include\RUS\Config_en.ini; DestDir: {tmp}; Flags: dontcopy
Source: Include\ENG\Config_en.ini; DestDir: {tmp}; Flags: dontcopy
;
; Выставляем поддерживаемые языки в программе:
[Languages]
Name: en; MessagesFile: compiler:Default.isl
Name: ru; MessagesFile: compiler:Languages\Russian.isl
;
; Заменяем стандартные диалоги на свои любимые:
[Messages]
SetupAppTitle={#Name}
SelectLanguageTitle={#Name}
ru.SelectLanguageLabel=Выберите язык, который будет использован в программе распаковки:
en.SelectLanguageLabel=Select the language to use in the unpacking program:
;
; Добавляем свои кастомные диалоги:
[CustomMessages]
ru.SelectArch=Выберите файл архива для распаковки
ru.SelectedArch=Выбран архивный файл :
en.SelectArch=Select archive file to unpack
en.SelectedArch=Selected archive file :
;
; //////////////////////////////////////
; А тут пошла секция кода Code (пробелы у Code убираем, т.к. форум их воспринимает как ББ-код):
[ Code ]
// Допустим, берём любой текст из INI-файла, в данном случае название экзешника 7z.exe. Пишем для этого функцию:
// В INI секция [Support], а под ней ключ UNPACK_ARCH=7z.exe.
// Захватываем через переменную тот языковой INI, который язык юзер выбрал при запуске программы:
function UnpackArch(Default:String):String;
Begin
Result:=GetIniString('Support', 'UNPACK_ARCH', '', ExpandConstant('{tmp}\Config_{language}.ini'));
end;
{ Команда кнопки "Распаковать архив". Код самой кнопки приводить не буду, у вас своя кнопка }
procedure UnpackArchButtonClick(Sender: TObject);
// Объявляем новую переменную названия выбранного архива через проводник Windows:
var
ArchName: String;
begin
// Извлекаем из инсталлятора в {tmp} файлы архиватора:
ExtractTemporaryFile('7z.exe');
ExtractTemporaryFile('7z.dll');
// Присваиваем в объявленную выше переменную имя выбранного архива:
ArchName := '';
// Открываем архив в проводнике Windows:
if GetOpenFileName(ExpandConstant('{cm:SelectArch}'),ArchName,ExpandConstant('{src}'),ExpandConstant('{ cm:ArchFiles}')+' (001,ZIP,RAR,7z)|*.001;*.zip;*.rar;*.7z|'+ExpandConstant('{cm:TOMFile}')+' (*.001)|*.001|'+ExpandConstant('{cm:ZIPFile}')+' (*.zip)|*.zip|'+ExpandConstant('{cm:RARFile}')+' (*.rar)|*.rar|'+ExpandConstant('{cm:RARMFile}')+' (*.part1.rar)|*.part1.rar|'+ExpandConstant('{cm:SevenFile}')+' (*.7z)|*.7z|'+ExpandConstant('{cm:AllFiles}')+'|*.*','001') then
// Затем отображаем в окошке имя выбранного архива и спрашиваем подтверждение или отказ на извлечение:
if MsgBox(ExpandConstant('{cm:SelectedArch}')+#10#10+ArchName+#10#10+ExpandConstant('{cm:ExtractArch}') , mbInformation, MB_YESNO) = IDYES then
// В случае согласия, травим архив на экзешник 7z.exe, а на втором месте указываются параметры, про которые вы спрашивали, один из параметров (толькодлясвоих) - это пароль:
if not ShellExec('open',ExpandConstant('{tmp}\{code:UnpackArch}'),'x -y -oExtractedArchive -pтолькодлясвоих '+'"'+ArchName+'"',ExpandConstant('{src}'),SW_SHOWNORMAL,ewWaitUntilTerminated,ResultCode) then
MsgBox(ExpandConstant('{code:NotFileOnDiskMsg}'),mbCriticalError,MB_OK);
begin ShellExec('open',ExpandConstant('{src}\ExtractedArchive'),'','',SW_SHOWNORMAL,ewWaitUntilIdle,Result Code) end;
end;
Maratina
05-11-2018, 08:57
как установить punkbuster в тихую? без принятия соглашения и тд?
параметры я нашел в логах...
--install --install-dlls="D:\Games\Battlefield 2" --i-accept-the-pb-eula --no-prompts --no-display
но {src} не передается как папка где лежит инсталл
пример-
Exec(ExpandConstant ('{src}\punkbuster\redist\pbsvc.exe'), '--install --install-dlls="{src}" --i-accept-the-pb-eula --no-prompts --no-display', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
и установка punkbuster с ошибкой "не удается найти указанный путь {src}
в логе после этого...
El Sanchez
05-11-2018, 11:34
и установка punkbuster с ошибкой "не удается найти указанный путь {src} »
Maratina, раскрывать нужно константы.
[Run]
Filename: {src}\punkbuster\redist\pbsvc.exe; Parameters: "--install --install-dlls=""{src}"" --i-accept-the-pb-eula --no-prompts --no-display"; Flags: nowait
; или в [Code]
Exec(ExpandConstant('{src}\punkbuster\redist\pbsvc.exe'), '--install --install-dlls=' + ExpandConstant('"{src}"') + ' --i-accept-the-pb-eula --no-prompts --no-display', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.