Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 6]

Закрытая тема
Настройки темы
Скрипты Inno Setup. Помощь и советы [часть 6]

Аватара для El Sanchez

Ветеран


Contributor


Сообщения: 1274
Благодарности: 1030


Конфигурация

Профиль | Отправить PM | Цитировать


Изменения
Автор: El Sanchez
Дата: 16-02-2015
Внимание! Данная тема предназначена только для обсуждения написания скриптов !
Остальные вопросы, а также последние версии компилятора в теме
Inno Setup. Прочие вопросы.


Показать/скрыть: Справка, руководство, примеры:
Показать/скрыть: Ссылки на примеры скриптов:
Показать/скрыть: Дополнительные программы для Inno Setup:
  • ISTool - неплохой редактор скриптов Inno Setup.
    Последняя версия: 5.3.0.1 [29.09.2009] - Скачать | зеркало;

  • Inno Script Generator - генератор скриптов Inno Setup. Обладает некоторыми полезными функциями, которых нет ни у самого Inno Setup, ни у ISTool.
    Последняя версия: 1.0.3.1 [23.03.2008] - Скачать | зеркало на русифицированную программу;
    Примечание: Родной сайт www.hisoft2000.de более недоступен, поэтому здесь расположены сторонние ссылки.

  • Inno Setup Form Designer - редактор страниц Inno Setup, можно создавать свои страницы.
    Последняя версия: 2.0.8 [12.11.2006] - Скачать;
    Примечание: Родной сайт http://isfd.kaju74.de/index.php?isfd более недоступен, поэтому здесь расположены сторонние ссылки.

  • Inno Setup GameScript Generator - программа генерирует скрипты для Inno Setup . С помощью GameScript Generator и Inno Setup вы сможете быстро создать простенький инсталляционный пакет для любой игры. В инсталлятор можно встроить музыку, слайдшоу и фоновый рисунок. Для специалистов созданный скрипт, возможно, будет неплохой заготовкой для дальнейшей модернизации;

  • ISSkin - Программа для создания и добавления в инсталлятор скинов. Инструкция.
    Последняя версия: 3.0.0.0 [19.01.2010] - Скачать;

  • ISSJoiner - Программа для объединения нескольких скриптов InnoSetup в один.
    Последняя версия: 3.0 [23.07.2009]

  • Converter - Программа конвертирует reg-файлы в формат *.iss (формат скриптов Inno Setup).
    Последняя версия: 0.1.4 [13.03.2010] - Скачать;


Предыдущие ветки обсуждения по ссылкам ниже и в прикреплённых архивах:

Отправлено: 19:06, 28-03-2013

 

Аватара для Johny777

Ветеран


Сообщения: 649
Благодарности: 444

Профиль | Отправить PM | Цитировать


R.i.m.s.k.y.,
Цитата R.i.m.s.k.y.:
я наверное что-то не так делаю, »
Вот чисто настройка привилегии:

читать дальше »
Код: Выделить весь код
#define A = (Defined UNICODE) ? "W" : "A"

const
    TOKEN_QUERY = $8;
    TOKEN_ADJUST_PRIVILEGES = $20;
    SE_PRIVILEGE_ENABLED = $2;
    ////////////////////////////////////////////////
    SE_CREATE_TOKEN_NAME = 'SeCreateTokenPrivilege';
    SE_ASSIGNPRIMARYTOKEN_NAME = 'SeAssignPrimaryTokenPrivilege';
    SE_LOCK_MEMORY_NAME = 'SeLockMemoryPrivilege';
    SE_INCREASE_QUOTA_NAME = 'SeIncreaseQuotaPrivilege';
    SE_UNSOLICITED_INPUT_NAME = 'SeUnsolicitedInputPrivilege';
    SE_MACHINE_ACCOUNT_NAME = 'SeMachineAccountPrivilege';
    SE_TCB_NAME = 'SeTcbPrivilege';
    SE_SECURITY_NAME = 'SeSecurityPrivilege';
    SE_TAKE_OWNERSHIP_NAME = 'SeTakeOwnershipPrivilege';
    SE_LOAD_DRIVER_NAME = 'SeLoadDriverPrivilege';
    SE_SYSTEM_PROFILE_NAME = 'SeSystemProfilePrivilege';
    SE_SYSTEMTIME_NAME = 'SeSystemtimePrivilege';
    SE_PROF_SINGLE_PROCESS_NAME = 'SeProfileSingleProcessPrivilege';
    SE_INC_BASE_PRIORITY_NAME = 'SeIncreaseBasePriorityPrivilege';
    SE_CREATE_PAGEFILE_NAME = 'SeCreatePagefilePrivilege';
    SE_CREATE_PERMANENT_NAME = 'SeCreatePermanentPrivilege';
    SE_BACKUP_NAME = 'SeBackupPrivilege';
    SE_RESTORE_NAME = 'SeRestorePrivilege';
    SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
    SE_DEBUG_NAME = 'SeDebugPrivilege';
    SE_AUDIT_NAME = 'SeAuditPrivilege';
    SE_SYSTEM_ENVIRONMENT_NAME = 'SeSystemEnvironmentPrivilege';
    SE_CHANGE_NOTIFY_NAME = 'SeChangeNotifyPrivilege';
    SE_REMOTE_SHUTDOWN_NAME = 'SeRemoteShutdownPrivilege';
    SE_UNDOCK_NAME = 'SeUndockPrivilege';
    SE_SYNC_AGENT_NAME = 'SeSyncAgentPrivilege';
    SE_ENABLE_DELEGATION_NAME = 'SeEnableDelegationPrivilege';
    SE_MANAGE_VOLUME_NAME = 'SeManageVolumePrivilege';
    SE_IMPERSONATE_NAME = 'SeImpersonatePrivilege';
    SE_CREATE_GLOBAL_NAME = 'SeCreateGlobalPrivilege';


type
    LUID = record
        LowPart: DWORD;
        HighPart: Longint;
    end;

    LUID_AND_ATTRIBUTES = record
        Luid: LUID;
        Attributes: DWORD;
    end;

    TOKEN_PRIVILEGES = record
        PrivilegeCount: DWORD;
        Privileges: array [0..0] of LUID_AND_ATTRIBUTES;
    end;


function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function GetCurrentProcess(): THandle; external 'GetCurrentProcess@kernel32.dll stdcall';
function OpenProcessToken(ProcessHandle: THandle; DesiredAccess: DWORD; var TokenHandle: THandle): BOOL; external 'OpenProcessToken@advapi32.dll stdcall';
function LookupPrivilegeValue(lpSystemName, lpName: String; var lpLuid: LUID): BOOL; external 'LookupPrivilegeValue{#A}@advapi32.dll stdcall';
function AdjustTokenPrivileges(TokenHandle: THandle; DisableAllPrivileges: BOOL; NewState: TOKEN_PRIVILEGES; BufferLength: DWORD; var PreviousState: TOKEN_PRIVILEGES; var ReturnLength: Longint): BOOL; external 'AdjustTokenPrivileges@advapi32.dll stdcall';


function AdjustSelfProcessPrivileges(const PrivilegeName: String; const Enable: Boolean): Boolean;
var
    tkp: TOKEN_PRIVILEGES;
    hToken: THandle;
    ret: Longint;
begin
    // open process token adjust privileges
    if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
    try
        // Get the locally unique identifier (LUID) .
        if LookupPrivilegeValue('', PChar(PrivilegeName), tkp.Privileges[0].Luid) then
        begin
            // fill token privileges struct
            tkp.PrivilegeCount := 1; // one privilege to set
            if Enable then
            tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED else
            tkp.Privileges[0].Attributes := 0;
            // enable or disable the privilege
            Result := AdjustTokenPrivileges(hToken, False, tkp, SizeOf(tkp), tkp, ret);
            //if not Result then  ShowMessage(SysErrorMessage(GetLastError));
        end;
    finally
        CloseHandle(hToken);
    end;
end;





/////////////////////////////
procedure InitializeWizard();
begin
    if AdjustSelfProcessPrivileges(SE_DEBUG_NAME, True) then
    try
        MsgBox('Privilege Ajusted', mbInformation, MB_OK);
        MsgBox('Do something', mbInformation, MB_OK);
    finally
        if AdjustSelfProcessPrivileges(SE_DEBUG_NAME, False) then MsgBox('Privilege Not Ajusted', mbInformation, MB_OK);
    end
    
    else MsgBox('Error', mbInformation, MB_OK);
end;


Какая из них тебе нужна не заню
Предполагаю - для каждого действия с твоей стороны нужна своя привилегия, а не одна на все!
Если используешь несколько подряд. Не забывай удалять старую (при помощи булев аргумента Enable) перед настройкой новой

UPD:
Кажись это всё-таки то, что тебе нужно. Вот статья http://www.rsdn.ru/article/baseserv/privileges.xml
там написано: " Учетные записи пользователей и групп являются доверенными объектами системы. Доверенные объекты – это сущности, которым может быть предоставлен или отклонен доступ к защищаемым объектам или ресурсам системы. Привилегии – это права доверенного объекта на совершение каких-либо действий по отношению ко всей системе."

Последний раз редактировалось Johny777, 20-07-2013 в 13:08. Причина: updated

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:42, 20-07-2013 | #821



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для R.i.m.s.k.y.

Ветеран


Сообщения: 1640
Благодарности: 536

Профиль | Отправить PM | Цитировать


Johny777, крокодил не растет, регистрация валится с ошибкой 0х05
Код: Выделить весь код
    if AdjustSelfProcessPrivileges(SE_BACKUP_NAME, True) then   //SE_TCB_NAME
    try
        MsgBox('Privilege Ajusted', mbInformation, MB_OK);
        MsgBox('Do something', mbInformation, MB_OK);
        RegisterServer(true, 'c:\Program Files (x86)\LAV\LAVVideo.ax', False);
    finally
    //    if AdjustSelfProcessPrivileges(SE_DEBUG_NAME, False) then MsgBox('Privilege Not Ajusted', mbInformation, MB_OK);
    end
        else MsgBox('Error', mbInformation, MB_OK);

-------
Хороший установщик тот, которого не замечаешь
Оформление в инно пустая трата времени: толку мало, головняка много, а ошибок истчо больше!


Отправлено: 14:04, 20-07-2013 | #822


Аватара для Johny777

Ветеран


Сообщения: 649
Благодарности: 444

Профиль | Отправить PM | Цитировать


Цитата R.i.m.s.k.y.:
регистрация валится с ошибкой 0х05 »
Текст ошибки можно получить так: MsgBox(SysErrorMessage($05), mbError, MB_OK); // 0x05 = $05

// MsgBox( SysErrorMessage(DLLGetLastError), mbError, MB_OK ); можно вызывать после каждой функции если она не отработала

""Отказано в доступе"". Значит у тебя нет привилегии/права делать это. Пробуй другие привилегии, пока не получится. Метод проб и ошибок - тоже метод И какое отношени имеет "Резервное копирование" к регистрации?
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:35, 20-07-2013 | #823


Аватара для R.i.m.s.k.y.

Ветеран


Сообщения: 1640
Благодарности: 536

Профиль | Отправить PM | Цитировать


Johny777, я знаю что 0х05 "ты не лев, недостаточно прав"
SE_TCB_NAME - тоже самое

такой еще вопрос знатокам - RunAsOriginalUser должен чье имя возвращать? originalUser или админа введшего пароль?
Код: Выделить весь код
[Setup]
PrivilegesRequired=admin

procedure InitializeWizard();
var ResultCode : integer;
begin
  ExecAsOriginalUser('cmd.exe', '/c echo > c:\1\1.txt %username%', ExpandConstant('{sys}'), SW_SHOW, ewWaitUntilTerminated, ResultCode);
end;
инсталл запускается двойным кликом (не ПКМ - запуск от...), UAC спрашивает логин/пасс админа, и в c:\1\1.txt появляется имя одмина, хотя КМК там должно быть имя User'а тк он вошел в систему

-------
Хороший установщик тот, которого не замечаешь
Оформление в инно пустая трата времени: толку мало, головняка много, а ошибок истчо больше!


Отправлено: 17:14, 20-07-2013 | #824


Пользователь


Сообщения: 80
Благодарности: 3

Профиль | Отправить PM | Цитировать


Ребят, какой код надо написать, чтобы Inno понял, что на этой форме должен быть выбор компонентов?

Отправлено: 22:24, 20-07-2013 | #825


Аватара для R.i.m.s.k.y.

Ветеран


Сообщения: 1640
Благодарности: 536

Профиль | Отправить PM | Цитировать


Mat_y, а стандартый [Components] чем не устраивает?

-------
Хороший установщик тот, которого не замечаешь
Оформление в инно пустая трата времени: толку мало, головняка много, а ошибок истчо больше!


Отправлено: 22:37, 20-07-2013 | #826


Ветеран


Сообщения: 517
Благодарности: 314

Профиль | Отправить PM | Цитировать


Цитата R.i.m.s.k.y.:
UAC спрашивает логин/пасс админа, и в c:\1\1.txt появляется имя одмина, хотя КМК там должно быть имя User'а тк он вошел в систему »
А разве в этом случае установка идет уже не под админом?
Цитата R.i.m.s.k.y.:
[Setup] PrivilegesRequired=admin »
Указывает, что инсталу для работы нужны повышеные полномочия. Но лишь указывает. При запуске винда видит, что инсталу нужно повышение полномочий, что она и делает, автоматически запуская от имена админа. Так что в данном случае дальнейшее RunAsOriginalUser будет уже админ. Или не? В этих учетных записях тёмный лес.
Цитата Mat_y:
Ребят, какой код надо написать, чтобы Inno понял, что на этой форме должен быть выбор компонентов? »
Для сего действа есть секция [Components]
Код: Выделить весь код
[Components]
Name: a; Description: Компонент 1; Types: full;
Name: b; Description: Компонент 2; Types: custom;

Последний раз редактировалось saurn, 20-07-2013 в 23:05.


Отправлено: 22:52, 20-07-2013 | #827


Пользователь


Сообщения: 80
Благодарности: 3

Профиль | Отправить PM | Цитировать


Цитата:
Mat_y, а стандартый [Components] чем не устраивает?
Не ребят, Вы меня не поняли... это все логично и понятно... но вот есть окна в установщике... приветствие, выбор директории установки, далее обычно идет выбор компонентов установки, и потом уже окно с ходом установки. Я использовал готовый скрипт и модифицировал его, но там нету окна с выбором компонентов... мне удалось добавить недостающее окно между выбором директории и установкой, но вот как сказать в CODE установщику, что это именно нужное для компонентов окно и как разместить там само поле с выбором программ, я не догоняю.

Вот окно приветствия:

Вот выбор директории:

И установка:


Я продублировал окно с выбором директории... изменил все переменные, убрал лишнее... а вот как туда вставить поле с выбором компонентов... сижу, второй день туплю.


ВОТ пример создания старницы выбора директории:

1) Создаются кнопки, выбор директории, назад, далее:
Код: Выделить весь код
procedure DirBrowseBtnClick(h:HWND);
begin
  WizardForm.DirBrowseButton.OnClick(WizardForm.DirBrowseButton);
  AppLabel.Caption:=WizardForm.DirEdit.Text;
  AppLabel2.Caption:=WizardForm.DirEdit.Text;
end;

procedure BackBtnClick(h:HWND);
begin
  WizardForm.BackButton.OnClick(WizardForm.BackButton);
  end;

procedure OKBtnClick(h:HWND);
begin
  WizardForm.NextButton.OnClick(WizardForm.NextButton);
begin HideWelcomePage; HideSelectDirPage;  ShowSelectComponentsPage;
     end;
  end;
2) Добавляется видео: (CreateSelectDirPage будет относится ко всему ниже... просто разобью на куски код)
Код: Выделить весь код
procedure CreateSelectDirPage;
begin
  if CanUseXvid then begin
    vPanel2:=TPanel.Create(WizardForm);
    with vPanel2 do begin
      Visible:=False;
      Parent:=WizardForm;
      SetBounds(32,32,704,272);
    end;
	  mciSendString('open '+ExpandConstant('{tmp}\vid_instdir.avi')+' alias sdVideo parent '+IntToStr(vPanel2.Handle)+' style child','',0,0);
    mciSendString('put sdVideo window at 0 0 704 272','',0,0);
  end;
3) Добавляем фоновую картинку, которая будет рамкой окна и в него вписываем путь установки:
Код: Выделить весь код
BkgImg2:=ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}\pbbkg.png'),28,347,0,0,False,True);

  AppLabel2:=TLabel.Create(WizardForm);
  with AppLabel2 do begin
    Parent:=WizardForm;
    Transparent:=True;
    Caption:=WizardForm.DirEdit.Text;
    with Font do begin
      Name:=FontName;
      Size:=11;
      Color:=clBlack;
    end;
    Left:=59;
    Top:=364;
  end;
  AppLabel:=TLabel.Create(WizardForm);
  with AppLabel do begin
    Parent:=WizardForm;
    Transparent:=True;
    Caption:=WizardForm.DirEdit.Text;
    with Font do begin
      Name:=FontName;
      Size:=11;
      Color:=$e5e5e5;
    end;
    Left:=57;
    Top:=362;
  end;
Ну и так далее...
А вот как сделать подобное для окна выбора компонентов?

Последний раз редактировалось Mat_y, 20-07-2013 в 23:58.


Отправлено: 23:44, 20-07-2013 | #828


Аватара для R.i.m.s.k.y.

Ветеран


Сообщения: 1640
Благодарности: 536

Профиль | Отправить PM | Цитировать


Цитата saurn:
А разве в этом случае установка идет уже не под админом? »
в том то и да что RunAsOriginalUser должна возвращать (и запускать) под пользователем, вошедшим в систему
Цитата saurn:
Указывает, что инсталу для работы нужны повышеные полномочия. Но лишь указывает. При запуске винда видит, что инсталу нужно повышение полномочий, что она и делает, автоматически запуская от имена админа. Так что в данном случае дальнейшее RunAsOriginalUser будет уже админ. Или не? В этих учетных записях тёмный лес. »
нет, при включенном UAC установщик скажет винде "мне нужны одминские права", UAC выдаст окно на логин/пасс одмина, и установщик продолжит от одмина, но фишка OriginalUser как раз в том чтобы поставить пользователю, в сессии которого запустили установщик, а не от которого запустили его

-------
Хороший установщик тот, которого не замечаешь
Оформление в инно пустая трата времени: толку мало, головняка много, а ошибок истчо больше!

Это сообщение посчитали полезным следующие участники:

Отправлено: 00:01, 21-07-2013 | #829


Аватара для Johny777

Ветеран


Сообщения: 649
Благодарности: 444

Профиль | Отправить PM | Цитировать


Mat_y, В данном скрипте окна "создаются" процедурами. Дело в том, что стандартный TNoteBook - древний предок TPageControl здесь скрыт, и есть только сама форма TWizardForm и в педелах клиентской области в зависимости от индекса текущей страницы становятся видимыми/невидимыми соответствующие элементы интефейса. Всё это наглядно видно в procedure CurPageChanged(CurPageID: Integer);
основного скрипта. Для того чтобы добавить ещё одну страницу между стр. выбора директории и стр. установки необходимо удалить директиву DisableReadyPage=yes из раздела [Setup]. Список страниц такой:
читать дальше »
Код: Выделить весь код
const
  wpWelcome = 1;
  wpLicense = 2;
  wpPassword = 3;
  wpInfoBefore = 4;
  wpUserInfo = 5;
  wpSelectDir = 6;
  wpSelectComponents = 7;
  wpSelectProgramGroup = 8;
  wpSelectTasks = 9;
  wpReady = 10;
  wpPreparing = 11;
  wpInstalling = 12;
  wpInfoAfter = 13;
  wpFinished = 14;

Те страница номер 10 то что нужну
Далее в procedure CurPageChanged(CurPageID: Integer);
добавим следующее (красным выделил имплиментацию новой страницы)
читать дальше »
Код: Выделить весь код
procedure CurPageChanged(CurPageID: Integer);
begin
  case CurPageID of
    wpWelcome: begin
      if PrevCurPageID=wpSelectDir then HideSelectDirPage;
      ShowWelcomePage;
    end;
    wpSelectDir: begin
      if PrevCurPageID=wpWelcome then HideWelcomePage;
      ShowSelectDirPage;
    end;
   
    wpReady: begin
      if PrevCurPageID=wpSelectDir then HideSelectDirPage;
      ShowSelectComonentsPage;
    end;
    
    wpInstalling: begin
      if PrevCurPageID=wpReady then HideSelectComonentsPage;
      ShowInstallingPage;
    end;
  end;
end;

Надеюсь ты понимаешь весь принцип. Те для каждой страницы Действуют 3 процедуры:
CreateИмяСтраницы (где-то во внешних библиотеках при инициализации)
ShowИмяСтраницы
HideИмяСтраницы
Остаётся только описание тела процедур для твоей новой страницы, и оно такое же как и у других страниц, только с твоим содержимым на ней (видео, чекбоксы и пр.)
Это сообщение посчитали полезным следующие участники:

Отправлено: 18:45, 21-07-2013 | #830



Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 6]

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Скрипты Inno Setup. Помощь и советы [часть 5] El Sanchez Автоматическая установка приложений 1999 28-03-2013 19:09
Скрипты Inno Setup. Помощь и советы [часть 4] El Sanchez Автоматическая установка приложений 2099 22-05-2012 23:16
Скрипты Inno Setup. Помощь и советы [часть 3] Serega Автоматическая установка приложений 3755 26-10-2011 17:58
[архив] Скрипты Inno Setup. Помощь и советы [часть 2] Serega Автоматическая установка приложений 2651 08-11-2010 18:34
Скрипты Inno Setup Compiler QAZAK Автоматическая установка приложений 7 15-01-2007 17:59




 
Переход