PDA

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


Страниц : 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 58 59 60 61 62 63 64 65 66 [67] 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

Johny777
24-11-2012, 20:33
Пацаны! Скажите пожалуйста чем можно заменить указатель в той или иной функции. Те например нужно воспользоваться вин апи функцией, а у неё один из входных параметров указатель
например function CopyFileEx(lpExistingFileName, lpNewFileName: PWideChar; lpProgressRoutine: TFNProgressRoutine; lpData: Pointer; pbCancel: PBool; dwCopyFlags: DWORD): BOOL; stdcall;
очень привлекательная функция которая может отображать прогресс копирования файла (суть не конкретно в ней, тк есть многo других с указателями)
но каким образом использовать её в инно. Как вообще поступать с Pointer-ом. В Windows.pas (Embarcadero RAD Studio/ Delphi 2010) они на каждом углу. Просветите меня пожалуйста на этот счёт!

#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif

const
{ Define possible return codes from the CopyFileEx callback routine }

PROGRESS_CONTINUE = 0;
//EXTERNALSYM PROGRESS_CONTINUE
PROGRESS_CANCEL = 1;
//EXTERNALSYM PROGRESS_CANCEL
PROGRESS_STOP = 2;
//EXTERNALSYM PROGRESS_STOP
PROGRESS_QUIET = 3;
//EXTERNALSYM PROGRESS_QUIET

{ Define CopyFileEx callback routine state change values }

CALLBACK_CHUNK_FINISHED = $00000000;
//EXTERNALSYM CALLBACK_CHUNK_FINISHED
CALLBACK_STREAM_SWITCH = $00000001;
//EXTERNALSYM CALLBACK_STREAM_SWITCH


{ Define CopyFileEx option flags }

COPY_FILE_FAIL_IF_EXISTS = $00000001;
//EXTERNALSYM COPY_FILE_FAIL_IF_EXISTS
COPY_FILE_RESTARTABLE = $00000002;
//EXTERNALSYM COPY_FILE_RESTARTABLE

type
Pointer = ?;
TFarProc = Pointer;
TFNProgressRoutine = TFarProc;
PBool = BOOL;

_ULARGE_INTEGER = record
LowPart: DWORD;
HighPart: DWORD;
end;


function Size64(QuadPart: _ULARGE_INTEGER): Extended;
begin
Result := $7FFFFFFF;
Result := ((QuadPart.HighPart + integer(QuadPart.LowPart < 0))*Result + QuadPart.HighPart + integer(QuadPart.LowPart < 0))*2 + QuadPart.LowPart;
end;

function CopyCallBack(TotalFileSize, TotalBytesTransferred, StreamSize, StreamBytesTransferred: _ULARGE_INTEGER;
dwStreamNumber, dwCallbackReason: DWORD; hSourceFile: THandle; hDestinationFile: THandle; ProgressBar : TNewProgressBar): DWORD;
var
newpos: Integer;
begin
Result := PROGRESS_CONTINUE;
if dwCallbackReason = CALLBACK_CHUNK_FINISHED then
begin
newpos := Round(Size64(TotalBytesTransferred) / Size64(TotalFileSize) * 100);
with Progressbar do
if newpos <> Position then
Position := newpos;
Application.ProcessMessages;
end;
end;

function CopyFileEx(lpExistingFileName, lpNewFileName: String; lpProgressRoutine: TFNProgressRoutine; lpData: Pointer; pbCancel: PBool; dwCopyFlags: DWORD): BOOL; external 'CopyFileEx{#A}@kernel32.dll stdcall';

habib2302
25-11-2012, 12:23
как сделать растяжение wizard small image на деинсталляторе с сокрытием лейбелов и как сделать,чтобы кликабельное лого отображалось в деинсталляторе
вот скрипт на отображение лого в инсталляторе



[Files]
Source: logo.bmp; Flags: dontcopy

[Code]
procedure InitializeWizard;
//Лого
var BtnImage: TBitmapImage;
begin
RedesignWizardForm;
ExtractTemporaryFile('logo.bmp');
BtnImage:= TBitmapImage.Create(WizardForm);
BtnImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\logo.bmp'));
BtnImage.SetBounds(20, 315, 154, 42); {первые 2 параметра - координаты левогого верхнего угла по горизонтали и вертикали, дальше ширина и высота, до которой растянуть}
BtnImage.Parent:= WizardForm;
BtnImage.Stretch:= True;

Mailchik
25-11-2012, 12:39
как сделать растяжение wizard small image на деинсталляторе с сокрытием лейбелов[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Code]
procedure InitializeUninstallProgressForm();
begin
with UninstallProgressForm do
begin
WizardSmallBitmapImage.SetBounds(MainPanel.Left, MainPanel.Top, ClientWidth, MainPanel.Height);
PageNameLabel.Hide;
PageDescriptionLabel.Hide;
end;
end; как сделать,чтобы кликабельное лого отображалось в деинсталляторе[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
BitmapResource=logo:logo.bmp

[Code]
procedure InitializeUninstallProgressForm();
begin
with TBitmapImage.Create(nil) do begin
Parent := UninstallProgressForm;
Bitmap.LoadFromResourceName(HInstance, '_IS_logo');
Stretch:= true;
SetBounds(ScaleX(20), ScaleY(315), ScaleX(154), ScaleY(42));
end;
end;
Johny777, Pointer в Inno не получится использовать, насколько я знаю.

habib2302
25-11-2012, 13:20
растяжение wizard small image на деинсталляторе с сокрытием лейбелов »
вместо wizard small image на деинсталляторе отображается иконка деинсталлятора
http://i48.fastpic.ru/big/2012/1125/d2/8c974d4b950be49a5d28dd53f06203d2.png (http://i48.fastpic.ru/big/2012/1125/f0/ab5ef436dc3d68c80d9179fd832b1ef0.png)
кликабельное лого отображалось в деинсталляторе »
выдает ошибку
http://i48.fastpic.ru/big/2012/1125/d1/3acbcdf8de5dffae8993bbf085e2c0d1.png (http://i47.fastpic.ru/big/2012/1125/20/21087e88d12c1c560e13a97924b3d120.png)

Mailchik
25-11-2012, 13:59
вместо wizard small image на деинсталляторе отображается иконка деинсталлятора Так я же не знаю какой файл у вас в bitmap. Я лишь пример дал, как сделать то, что вы просите.выдает ошибку Нужна расширенная версия от restools. Попробуйте InnoUltra (http://innoultra.ru/?dl_id=2)

habib2302
25-11-2012, 15:03
Так я же не знаю какой файл у вас в bitmap. Я лишь пример дал, как сделать то, что вы просите. »
у меня формат .bmp
Нужна расширенная версия от restools. Попробуйте Inno Ultra (http://www.oszone.net/go.php?url=http://innoultra.ru/?dl_id=2) »
у меня как раз и стоит inno setup ultra full ver. Обновлено 2 Октября 2012г

кликабельное лого отображалось в деинсталляторе »
скрипт на лого заработало!!!

El Sanchez
25-11-2012, 20:07
Скажите пожалуйста чем можно заменить указатель в той или иной функции. »
Пример: функция CreateFile (http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx) параметр lpSecurityAttributes (описание: A pointer to a SECURITY_ATTRIBUTES structure...)
Чем заменить:

Целочисленной переменной типа Integer, Longint, Cardinal, DWORD - CreateFile(..., lpSecurityAttributes: Longint, ...): BOOL;
Переменной типа, на которую указывает указатель - CreateFile(..., lpSecurityAttributes: SECURITY_ATTRIBUTES, ...): BOOL; Имеет смысл, если нужно заполнять самому структуру нужными данными. В функцию передается не указатель, а переменная lpSecurityAttributes, точнее ссылка на объект структурного типа SECURITY_ATTRIBUTES. Т.к. ссылки основаны на указателях, передача ссылки вместо указателя не ошибка.

P.S. Иногда при описании параметра какой-либо функции встречается запись "A pointer to a buffer...". В таком случае нужно использовать символьный (реже - байтовый) массив определенного размера (может указываться при описании параметров функции или вычисляться непосредственно при отработке функции).

Johny777, без остановок, пауз, с отменой операции, тупо копирование:


[Code]
#define A = (Defined UNICODE) ? "W" : "A"

const
PROGRESS_CONTINUE = 0;
PROGRESS_CANCEL = 1;
CALLBACK_CHUNK_FINISHED = $0;

var
ProgressPage: TOutputProgressWizardPage;
CancelButton: TButton;
bCancel: BOOL;

function CopyFileEx(lpExistingFileName, lpNewFileName: String; lpProgressRoutine, lpData: Longint; var pbCancel: BOOL; dwCopyFlags: DWORD): BOOL; external 'CopyFileEx{#A}@kernel32.dll stdcall';
function PathIsDirectory(pszPath: String): BOOL; external 'PathIsDirectory{#A}@shlwapi.dll stdcall';

/////////////////////////////////////////////////////////////
function Size64(LowPart: Longint; HighPart: DWORD): Extended;
begin
Result := (HighPart + integer(LowPart < 0))*4.294967296E9 + LowPart;
end;

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function CopyProgressRoutine(TotalFileSizeLo, TotalFileSizeHi, TotalBytesTransferredLo, TotalBytesTransferredHi, StreamSizeLo, StreamSizeHi, StreamBytesTransferredLo, StreamBytesTransferredHi: Longint; dwStreamNumber, dwCallbackReason: DWORD; hSourceFile, hDestinationFile: THandle; lpData: Longint): DWORD;
begin
if bCancel then Result := PROGRESS_CANCEL else Result := PROGRESS_CONTINUE;
case dwCallbackReason of
CALLBACK_CHUNK_FINISHED: begin
ProgressPage.SetText(Format('%s: %s', ['Файл', CastIntegerToString(lpData)]), Format('%s: %d %%', ['Прогресс', Round(100*Size64(TotalBytesTransferredLo, TotalBytesTransferredHi)/Size64(TotalFileSizeLo, TotalFileSizeHi))]));
ProgressPage.SetProgress(Round(100*Size64(TotalBytesTransferredLo, TotalBytesTransferredHi)/Size64(TotalFileSizeLo, TotalFileSizeHi)), 100);
end;
end;
end;

///////////////////////////////////////////////
procedure CancelButtonOnClick(Sender: TObject);
begin
bCancel := True;
end;

/////////////////////////////////
procedure CreateCopyProgressPage;
begin
ProgressPage := CreateOutputProgressPage('Копирование файлов', '');
CancelButton := TButton.Create(ProgressPage);
with CancelButton do
begin
Parent := ProgressPage.Surface;
SetBounds(ProgressPage.ProgressBar.Width - WizardForm.CancelButton.Width, ProgressPage.ProgressBar.Top + ProgressPage.ProgressBar.Height + ScaleY(10), WizardForm.CancelButton.Width, WizardForm.CancelButton.Height);
Caption := SetupMessage(msgButtonCancel);
OnClick := @CancelButtonOnClick;
end;
end;

///////////////////////////////////////////////////////////////////////////////////////////////////////
function FindFiles(const pFrom, pTo: String; const Recurse: Boolean; const szRootDir: String): Integer;
var
FR: TFindRec;
szFileName: String;
begin
if FindFirst(pFrom, FR) then
try
repeat
if (FR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0) then
begin
if not DirExists(Format('%s\%s', [pTo, ExtractRelativePath(szRootDir, ExtractFilePath(pFrom))])) then ForceDirectories(Format('%s\%s', [pTo, ExtractRelativePath(szRootDir, ExtractFilePath(pFrom))]));
szFileName := MinimizePathName(Format('%s\%s', [ExtractFileDir(pFrom), FR.Name]), WizardForm.Font, WizardForm.OuterNotebook.ClientWidth - ScaleX(50));
CopyFileEx(Format('%s\%s', [ExtractFileDir(pFrom), FR.Name]), Format('%s\%s\%s', [pTo, ExtractRelativePath(szRootDir, ExtractFilePath(pFrom)), FR.Name]), CallbackAddr('CopyProgressRoutine'), CastStringToInteger(szFileName), bCancel, 0);
Result := DLLGetLastError;
if bCancel then Exit;
end;
until not FindNext(FR);
finally
FindClose(FR);
end;
//
if not Recurse then Exit;
if FindFirst(Format('%s\*', [ExtractFileDir(pFrom)]), FR) then
try
repeat
if (FR.Attributes and FILE_ATTRIBUTE_DIRECTORY <> 0) and (FR.Name <> '.') and (FR.Name <> '..') then
FindFiles(Format('%s\%s\%s', [ExtractFileDir(pFrom), FR.Name, ExtractFileName(pFrom)]), pTo, Recurse, szRootDir);
until not FindNext(FR);
finally
FindClose(FR);
end;
end;

//////////////////////////////////////////////////////////////////////////
function xcopy(const pFrom, pTo: String; const Recurse: Boolean): Integer;
// pFrom - source path. wildcard allowed
// pTo - destination path
// Recurse - recursion flag
begin
if PathIsDirectory(pFrom) then
begin
if not DirExists(pFrom) then Exit;
pFrom := Format('%s\*', [pFrom]);
end else if not DirExists(ExtractFileDir(pFrom)) then Exit;
Result := FindFiles(pFrom, pTo, Recurse, ExtractFilePath(pFrom));
end;


/////////////////////////////
procedure InitializeWizard();
begin
CreateCopyProgressPage;
end;


//////////////////////////////////////////////////////
function NextButtonClick(CurPageID: Integer): Boolean;
begin
if CurPageID = wpWelcome then
begin
ProgressPage.Show;
xcopy('c:\Temp', 'd:\test', True);
//xcopy('c:\temp\te st\*.dll', 'd:\test', True);
//xcopy('c:\Temp\ffc\FileFormatConverters.7z', 'c:\Temp\FileFormatConverters.7z', False);
//xcopy('c:\temp\t est\123', 'c:\temp\t est\1234', True);
ProgressPage.Hide;
Result := True;
end;
Result := True;
end;

Johny777
26-11-2012, 03:03
El Sanchez, спасибо, кажись догоняю:
Если значение/значения из переменной, на которую указывает указатель не нужно можно заменять в функциях/процедурах указатели на целочисленные Integer, Longint, Cardinal, DWORD... чтоб компилятор не ругался на неизвестный тип. Это делается когда из переменной или из переменной ссылающейся на структурный тип, на которую указывает указатель брать ничего не нужно

Если значение/значения нужно, то:
- если указатель на какую-то простую переменную (например type PInteger = ^Integer - указатель на целое число), то в заголовке функции можно заменить PInteger на Integer. Например:
function GetVolumeInformation(lpRootPathName, lpVolumeNameBuffer: String; nVolumeNameSize, lpVolumeSerialNumber: PDWORD(меняем на DWORD); var lpMaximumComponentLength, lpFileSystemFlags: DWORD; lpFileSystemNameBuffer: String; nFileSystemNameSize: DWORD): BOOL; external 'GetVolumeInformation{#A}@kernel32.dll stdcall';
- если указатель на переменную структуры (var MyVariable :SECURITY_ATTRIBUTES), то нужно описать SECURITY_ATTRIBUTES в разделе type и присвоить этот тип соответствующим переменным (в заголовке ф-ции и в разделе var)
короче суть в том что указатель можно заменить на переменную,
если указатель на буфер то методом проб и ошибок подставляем array [0..число] of Char или array [0..число] of Byte

без остановок, пауз, тупо копирование »
Спасибо! :)

R.i.m.s.k.y.
26-11-2012, 09:35
как в начале установщика получать права "от администратора"?
и запускать из установщика экзешники с такими же правами
http://rghost.ru/41816068/image.png (http://rghost.ru/41816068.view)

Johny777
26-11-2012, 14:42
R.i.m.s.k.y., по умолчанию ты инсталл без прав админа не запустишь, а чтобы отключить нужно настраивать директиву секции [Setup] PrivilegesRequired=не админ
если запускаешь не как админ, то получаешь вот такое окно от винды
http://img12.imageshack.us/img12/3947/89188377.png (http://imageshack.us/photo/my-images/12/89188377.png/)
запускать из установщика экзешники с такими же правами »
через встроенную функцию
function ExecAsOriginalUser(const Filename, Params, WorkingDir: String; const ShowCmd: Integer; const Wait: TExecWait; var ResultCode: Integer): Boolean;
хотя уверен достаточно и обычных
function Exec(const Filename, Params, WorkingDir: String; const ShowCmd: Integer; const Wait: TExecWait; var ResultCode: Integer): Boolean;
function ShellExec(const Verb, Filename, Params, WorkingDir: String; const ShowCmd: Integer; const Wait: TExecWait; var ErrorCode: Integer): Boolean;
или секции [RUN]
ведь если инсталл запущен и работает, то мы уже зашли под админом и по дефолту запускается все с его правами

R.i.m.s.k.y.
26-11-2012, 14:43
Johny777
ненене
я не зря привел скриншот, PrivilegesRequired проверка на входимость пользователя в системную локальную/доменную группу Администраторы
А на моем скрине выше - запуск от root-администратора (в лине это root, в винде не знаю как называется, причем пользователь Администратор и вот этот root-администратор - разные вещи, у последнего ВСЕ права на ВСЁ, в тч на реестр)
Вот такой запуск мне и нужен, от root'a

El Sanchez
26-11-2012, 17:53
если указатель на переменную структуры (var MyVariable :SECURITY_ATTRIBUTES), то нужно описать SECURITY_ATTRIBUTES в разделе type и присвоить этот тип соответствующим переменным (в заголовке ф-ции и в разделе var)
короче суть в том что указатель можно заменить на переменную »
Johny777, указатель и есть переменная, хранящая адрес переменной, на которую указывает указатель. Адрес - число из диапазона целых чисел от 0 до 2^31-1 (диапазон адресов памяти, доступных 32-разрядному процессу). За неимением указателей в Inno последние можно заменить переменными целочисленного типа, доступными хранить числа из вышеуказанного диапазона.
Теперь опять про CreateFile с параметром lpSecurityAttributes. Можно объявить как lpSecurityAttributes: SECURITY_ATTRIBUTES, заполнить самому структуру и в функцию передать объявленную переменную типа SECURITY_ATTRIBUTES, а можно объявить как lpSecurityAttributes: Longint, вычислить адрес объявленной переменной самому (сам понимаешь, что в Inno адрес такой переменной не получить. Исключение: для переменной строкового типа можно получить ее адрес при помощи ф-ии CastStringToInteger) и передать в функцию. Но 0 передать можно (This parameter can be NULL).
В общем, для просветления кармы почитай http://www.transl-gunsmoker.ru/2009/09/blog-post.html

причем пользователь Администратор и вот этот root-администратор - разные вещи, у последнего ВСЕ права на ВСЁ, в тч на реестр »
R.i.m.s.k.y., это один и тот же пользователь. Установщику с дефолтным (admin) значением директивы PrivilegesRequired до лампочки ПКМ Запуск от имени администратора.

Mailchik
26-11-2012, 21:29
Скажите пожалуйста как добавлять цветные строки в TListBox.Items.Add для события OnDrawItem TDrawItemEvent = procedure(Control: TWinControl; Index: Integer; Rect: TRect; State: Byte); не хочет работать это событие заложено, но видимо еще не реализовано. надо ждать, когда restools реализуют.

R.i.m.s.k.y.
27-11-2012, 11:18
R.i.m.s.k.y., это один и тот же пользователь. »
нет, не один и тот же
При запуске от рут-админа (как на скрине выше) доступны локальные ресурсы пользователя, но с админскими правами, а если запустить от имени другого пользователя и ввести "Администратор" - пасс, ресурсы совсем другие
Энивей по вашей логике должен работать скрипт
[Setup]
AppId={{DACC4133-A178-4B85-842A-58B74AEDE27E}
AppName=My Program
AppVersion=1.5
AppPublisher=My Company, Inc.
AppPublisherURL=http://www.example.com/
AppSupportURL=http://www.example.com/
AppUpdatesURL=http://www.example.com/
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
DisableProgramGroupPage=yes
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes
PrivilegesRequired=admin

[Registry]
Root: HKCU; SubKey: Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.TS\UserChoice; ValueType: string; ValueName: ProgId; ValueData: Applications\mpc-hc.exe

однако ошибка доступа
---------------------------
Ошибка
---------------------------
Ошибка создания ключа реестра:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.TS\UserChoice



RegCreateKeyEx: сбой; код 5.

Access is denied.



Нажмите «Повтор», чтобы повторить попытку, «Пропустить», чтобы пропустить файл, или «Отказ» для отмены установки.
---------------------------
Abort Retry Ignore
---------------------------

TecktonEast
27-11-2012, 14:45
del.

habib2302
27-11-2012, 21:28
люди.помогите мне объединить эти два скрипта

procedure InitializeUninstallProgressForm();
begin
with TBitmapImage.Create(nil) do
begin
Parent := UninstallProgressForm;
Bitmap.LoadFromResourceName(HInstance, '_IS_logo');
Stretch:= true;
SetBounds(ScaleX(20), ScaleY(315), ScaleX(154), ScaleY(42)); {первые 2 параметра - координаты левогого верхнего угла по горизонтали и вертикали, дальше ширина и высота, до которой растянуть}
end;
end;
procedure InitializeUninstallProgressForm();
begin
FileCopy(ExpandConstant('{app}\WizardSmallImage.bmp'), ExpandConstant('{app}\WizardSmallImage.bmp'), False);
with UninstallProgressForm.WizardSmallBitmapImage do
begin
Bitmap.LoadFromFile(ExpandConstant('{app}\WizardSmallImage.bmp'));
end;
end;

pritoreanic
28-11-2012, 01:32
habib2302 »

procedure InitializeUninstallProgressForm();
begin
with TBitmapImage.Create(nil) do
begin
Parent := UninstallProgressForm;
Bitmap.LoadFromResourceName(HInstance, '_IS_logo');
Stretch:= true;
SetBounds(ScaleX(20), ScaleY(315), ScaleX(154), ScaleY(42));
end;
end;

begin
FileCopy(ExpandConstant('{app}\WizardSmallImage.bmp'), ExpandConstant('{app}\WizardSmallImage.bmp'), False);
with UninstallProgressForm.WizardSmallBitmapImage do
begin
Bitmap.LoadFromFile(ExpandConstant('{app}\WizardSmallImage.bmp'));
end;
end.

SoulSide
28-11-2012, 13:52
как в начале установщика получать права "от администратора"? »Никак! Inno не умеет этого делать.

На всё про всё пара примеров.

[Setup]
PrivilegesRequired=admin
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.

[Dirs]
Name: {app}; Permissions: everyone-modify

Permissions: admins-full
Permissions: authusers-full
Permissions: everyone-full
Permissions: powerusers-full
Permissions: system-full
Permissions: users-full


[Setup]
AppName=My Program
AppVerName=My Program 1.5
; программа установки обнаружит работает ли он, как повышенный пользователь администратора и по умолчанию путь установки в Program Files
DefaultDirName={code:DefDirRoot}\AppName
DefaultGroupName=My Program
OutputDir=.

;Это приведет к тому, чтобы запустить программу установки без подъема для не-администратора пользователей из под Windows.
PrivilegesRequired=none

[*Code]
function IsRegularUser(): Boolean;
begin
Result := not (IsAdminLoggedOn or IsPowerUserLoggedOn);
end;

function DefDirRoot(Param: String): String;
begin
if IsRegularUser then
Result := ExpandConstant('{localappdata}')
else
Result := ExpandConstant('{pf}')
end;



Как вы правильно заметили
root-администратора » как в линукс.

это один и тот же пользователь. Установщику с дефолтным (admin) значением директивы PrivilegesRequired до лампочки ПКМ Запуск от имени администратора. »Не путать с Администратором Windows.

Как не пытайтесь. вот это:
[Registry]
Root: HKLM; Subkey: SYSTEM\CurrentControlSet\Enum\Root\LEGACY_MY_HARDWARE_SERVICE; ValueType: dword; ValueName: NextInstance; ValueData: $00000001; Flags: uninsdeletekeyifempty uninsdeletevalueДаже из под админа загнать не получится.

Про добавление привилегий папке или файлу, вообще молчу.

Добавлю: Ни разу не пробовал, но уверен что например NSIS способен дать повышенные привилегии, Inno нет.

R.i.m.s.k.y.
28-11-2012, 14:03
Никак! Inno не умеет этого делать. »
я в курсе что инно этого не сделает, но ведь из под инно можно вызвать что-нибудь чтобы внести изменения? к примеру хитрый запуск reg import
Если можно расширить вопрос не только записью в реестр но запуском приложений от рут-админа

El Sanchez
29-11-2012, 23:07
При запуске от рут-админа (как на скрине выше) доступны локальные ресурсы пользователя, но с админскими правами, а если запустить от имени другого пользователя и ввести "Администратор" - пасс, ресурсы совсем другие »
R.i.m.s.k.y., все верно, за исключением рут-админа, ну нет его и все тут. Члены группы Администраторы и сам встроенный Администратор работают с правами обычного пользователя. При входе в систему администраторы получают 2 маркера доступа, регулирующих их права в системе - пользовательский и администраторский. Рабочий стол и Explorer.exe работают с правами обычного пользователя, запущенные процессы будут являться дочерними от своего Explorer-родителя и будут наследовать его права, т.е. запускаться с правами обычного пользователя. Но как только запуск приложения потребует от системы каких-либо привилегий (доступ в системные папки, определенные кусты реестра) наличие администраторского маркера позволяет повысить права в системе. При этом отображается запрос UAC для повышения прав и при согласии приложение начинает работу с администраторскими привилегиями пользователя. Отличие же встроенного Администратора от остальных админских учеток только в том, что для Администратора запрос UAC не появляется, для него в случае необходимости права повышаются автоматически. Также система сама определяет какие из приложений требуют повышения привилегий, делает это она, если не ошибаюсь, через службу Сведения о приложении. Наличие манифеста у исполняемого файла приложения с указанным уровнем привилегий, цифровая подпись помогут корректно определить службе уровень необходимых привилегий для запуска. В Inno Setup манифест подключается через секцию Setup, директива PrivilegesRequired, значение по умолчанию admin. No comments.
Однако есть приложения, уровень доступа которого определить система или не может, или нет необходимости. Это либо какое-нибудь старое, не подготовленное к работе в системе с UAC, приложение (без манифеста, без подписи, от неизвестного издателя), либо, например, та же консоль - cmd.exe. Запуск ее не требует админских прав, запустится она с правами обычного пользователя, но с помощью нее можно пытаться выполнять команды, доступные администраторам, например, копирование в системную директорию system32 или в корень системного диска. Естественно ничего не выйдет, ведь консоль работает с правами обычного пользователя. Вот для таких программ, для которых уровень доступа определить нельзя или нет необходимости, но запустить их с повышенными правами очень хочется и сделана опция в контекстном меню "Запуск от имени администратора". Это не запуск с правами от какого-то мифического супер-пупер администратора, а повышение своих же прав согласно наличию выданного системой администраторского маркера доступа. Microsoft-у следовало бы назвать эту опцию, например, "Запуск с повышенными правами", однако решили, что оттягивающее на себя слово "...администратора" убедит пользователя спать спокойно и не волноваться, что его урезали в правах (IMHO, конечно :)). Вот как-то так.

Энивей по вашей логике должен работать скрипт »
Ошибка создания ключа реестра:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.TS\UserChoice »
R.i.m.s.k.y., тут у меня один вариант. Этот лог при запуске сетапа от имени учетной записи Администратор с вводом учетных данных (логин - пасс). Администратор активирован, пароль присвоен, но входа в учетку никогда не было, следовательно профиля нет, пользовательского куста реестра нет, писать некуда.

Как не пытайтесь. вот это:
Код:
[Registry]
Root: HKLM; Subkey: SYSTEM\CurrentControlSet\Enum\Root\LEGACY_MY_HARDWARE_SERVICE; ValueType: dword; ValueName: NextInstance; ValueData: $00000001; Flags: uninsdeletekeyifempty uninsdeletevalue
Даже из под админа загнать не получится. »
SoftLine, верно, не получится. В указанный куст имеет право писать только пользователь SYSTEM, остальные только читают. Хотите туда писать - раздавайте права самостоятельно.




© OSzone.net 2001-2012