Мне нужна помощь с настройкой Inno, пожалуйста.
Моя проблема заключается в том, чтобы разместить «файлы» и выполнить «действия» там, где я хочу их «Слепо».
Чтобы сделатьКороче говоря, с одним исключением, кажется, что все, что я хочу сделать в / в папке "System32", в конечном итоге находится в / в папке "SysWow64".Кажется, не имеет значения, как я это называю, {sys}, {syswow64}, {sd} \ windows \ system32, {sd} \ windows \ syswow64 или в моем разделе кода% systemdrive% \ windows \ system32,%systemdrive% \ windows \ syswow64 или Expandconstant ('{sys}') \ filename.exe и т. д.Я даже пытался жестко кодировать "c: \ windows \ system32 \ filename.exe" и так далее.В любом случае, кроме одного, он делал это в / в папке syswow64.
Я знаю разницу между system32 и папкой syswow64.(64 бита против 32 бита) Я потратил больше недели, пытаясь заставить мой код поместить вещи, где я говорю это «вслепую».Много исследований на многих форумах, в том числе и здесь, ни один из них не дает хорошей информации и не дает четких примеров того, как мне нужен контроль.Я знаю, какой файл является 32-битным, а какой - 64-битным, и в какую папку каждый должен зайти.Но Inno Setup неправильно думает, что знает лучше.
Хотелось бы отключить эту функцию и заставить ее использовать абсолютные пути, которые я выбираю, когда пишу их в коде и т. Д., Но я не нашел способа сделать это, поэтому я спрашиваю, как сделать InnoПрограмма установки помещает вещи туда, куда я говорю, а не туда, где, как она думает, должна идти.
Независимо от того, как я пытался, лучшее, что я могу сделать, - заставить его создавать резервные копии файлов, которые я собираюсь перезаписать вsystem32 и в папке syswow64 правильно.После этого «все» всегда выполняется в папке syswow64, опять же, независимо от того, как я кодирую путь или какие флаги я использую, такие как 64-битные и т. Д.
Моя цель с этой программой состоит из двух частей, основнойОдин из них - узнать, как использовать Inno Setup, чтобы получить контроль над файлом / папкой, изменять разрешения при необходимости, копировать целевой файл, затем восстанавливать права доступа и т. д. Я могу делать это целый день с файлами .bat.Но я хочу использовать Inno Setup, потому что это может помочь мне выполнить часть «Удаление» моего проекта, которая отменит те изменения, которые я хочу внести, и восстановит файлы до их первоначальной конфигурации и т. Д. (Эта часть этого проекта, вероятно, потребует моеговозвращаясь на этот форум за дополнительной помощью)
Что этот конкретный код собирается сделать, это заменить калькулятор Windows 10 на версию Windows 7, которую я предпочитаю. И я хочу использовать Inno Setup, чтобы я мог"Uninstaller" отложил все это назад. Я знаю, что другие уже написали код для этого, и у меня есть доступ к этим программам из надежных источников, которые, я уверен, не выдают "Зло", изображающее из себя "Хорошо", но вВ моей корпоративной среде я не могу рисковать, и единственное, на 100% что я могу быть уверен, что такой код свободен от зла, - это написать его самому. Плюс, как я уже сказал, он дает отличную возможность изучить несколько методов одновременно.
Как я сказал, я могу, и написал .bat файл, который может создать резервную копию существующегоФайлы calc.exe, которые в 64-битной версии Win 10 существуют как в папках system32, так и в syswow64, поэтому мне нужен мой код для работы с «обеими» папками и замены их соответствующими версиями Win 7 и т. д.так что я знаю, что это можно сделать.Мне просто нужно знать, как это сделать в Inno Setup.Мой код, несколько разных версий из-за игры с синтаксисом путей, все смогли сделать резервную копию и перезаписать файл calc.exe в syswow64, но не system32 в 64-битной ОС Win 10.
Мой код размещен ниже. В нем вы можете увидеть множество закомментированных строк, которые показывают различные способы, которыми я пытался указать пути по мере необходимости. Вы также увидите, что я пытаюсь не вставлять файл .bat с моими вызовами ICACLS.exe и Takeown.exe для контроля разрешений, и я использую, возможно, неправильно, опцию «Beforinstall» для резервного копирования разрешений. а затем изменил файл назначения, чтобы я мог перезаписать его и т. д. Я также стараюсь избегать каких-либо действий в разделе «Выполнить», так как в этом проекте это не требуется. У меня также есть много окон сообщений для обратной связи, которые будут закомментированы в окончательной версии, а также "/ k" будет изменен на "/ c" или, если я смогу заставить его работать, просто позвоните программы ICACLS.exe и Takeown.exe напрямую, вместо того, чтобы выдавать «cmd.exe». У меня была такая работа, но я переключился на метод cmd.exe с / k для лучшей обратной связи во время этой фазы устранения неполадок и т. Д. Этот код, как ожидается, будет работать 99,99% времени на ОС Win 10 x64, но должен уметь правильно работать с операционной системой Win 10 x86. (Я нахожусь на Win 10 x64 V1709 для этого проекта)
; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{C771AFC7-CC36-4749-962D-119AD2671213}
AppName=Clasic Calculator
AppVerName=Classic Calculator Win 7 Style
AppPublisher=ACollege
AppPublisherURL=www.Acollege.edu
AppSupportURL=www.Acollege.edu
AppUpdatesURL=www.Acollege.edu
CreateAppDir=no
OutputDir=C:\InstallScripts\ClasicCalculator\Setup
OutputBaseFilename=SetupClasicCalc
ArchitecturesAllowed= x86 x64
;ArchitecturesInstallIn64BitMode=
PrivilegesRequired=admin
MinVersion = 0,5.0
Compression=lzma
SolidCompression=yes
CreateUninstallRegKey=yes
UpdateUninstallLogAppName=yes
uninstallable=yes
SetupIconFile="C:\InstallScripts\ClasicCalculator\calc-1.ico"
[Languages]
;Name: "english"; MessagesFile: "compiler:ASpyFolder.isl"
[Dirs]
;Win 10 Section
[Files]
;Windows 10 Section
;Testline for how is it running
;Source: "C:\InstallScripts\ClasicCalculator\Windows\SysWOW64\*.*"; DestDir: "c:\TempTest"; Permissions: authusers-full; Flags: createallsubdirs recursesubdirs overwritereadonly; Check: WhatIsIt
Source: "{syswow64}\calc.exe"; DestDir: "{syswow64}\W10CalcBak"; DestName: "Calc.exe"; Permissions: authusers-full; Flags: external; Check: IsWindows10 and not IsWin64
Source: "{sys}\calc.exe"; DestDir: "{sys}\W10CalcBak"; DestName: "Calc.exe"; Permissions: authusers-full; Flags: 64bit external; Check: IsWindows10 and IsWin64
;Source: "{sd}\windows\system32\calc.exe"; DestDir: "{sd}\windows\system32\W10CalcBak"; DestName: "Calc.exe"; Permissions: authusers-full; Flags: external; BeforeInstall: ChangeCalcPerms; Check: IsWindows10 and not IsWin64
;Source: "{sd}\windows\system32\calc.exe"; DestDir: "{sd}\windows\system32\W10CalcBak"; DestName: "Calc.exe"; Permissions: authusers-full; Flags: 64bit external; BeforeInstall: ChangeCalcPerms; Check: IsWindows10 and IsWin64
Source: "{syswow64}\calc.exe"; DestDir: "{syswow64}\W10CalcBak"; DestName: "Calc.exe"; Permissions: authusers-full; Flags: external; Check: IsWindows10 and IsWin64
Source: "C:\InstallScripts\ClasicCalculator\Windows\SysWOW64\*.*"; DestDir: "{syswow64}"; Permissions: authusers-full; Flags: createallsubdirs recursesubdirs overwritereadonly; BeforeInstall: ChangeCalcPerms; Check: IsWindows10 and IsWin64
Source: "C:\InstallScripts\ClasicCalculator\Windows\System32\*.*"; DestDir: "{sys}"; Permissions: authusers-full; Flags: createallsubdirs recursesubdirs overwritereadonly; Check: IsWindows10 and IsWin64
Source: "C:\InstallScripts\ClasicCalculator\Windows\SysWOW64\*.*"; DestDir: "{syswow64}"; Permissions: authusers-full; Flags: createallsubdirs recursesubdirs overwritereadonly; BeforeInstall: ChangeCalcPerms; Check: IsWindows10 and not IsWin64
;Source: "{win}\system32\en-US\calc.exe.mui"; DestDir: "{win}\system32\W10CalcBak"; DestName: "calc.exe.mui"; Permissions: authusers-full; Flags: external; Check: IsWindows10
[Registry]
[INI]
[Run]
[Code]
Function WhatIsIt(): Boolean;
begin
if Is64BitInstallMode then
begin
MsgBox('Installing in 64-bit mode', mbInformation, MB_OK)
end
else
begin
MsgBox('Installing in 32-bit mode', mbInformation, MB_OK);
end;
if IsWin64 then
begin
MsgBox('This is 64bit system', mbInformation, MB_OK)
MsgBox('(PF64)-bit program files reside in: ' + ExpandConstant('{pf64}'), mbInformation, MB_OK);
MsgBox('(PF32)-bit program files reside in: ' + ExpandConstant('{pf32}'), mbInformation, MB_OK);
MsgBox('(PF) program files reside in: ' + ExpandConstant('{pf}'), mbInformation, MB_OK);
MsgBox('(SYS) program files reside in: ' + ExpandConstant('{sys}'), mbInformation, MB_OK);
MsgBox('(SYS64) program files reside in: ' + ExpandConstant('{syswow64}'), mbInformation, MB_OK);
MsgBox('(SYS32) program files reside in: ' + ExpandConstant('{syswow64}'), mbInformation, MB_OK);
end
else
begin
MsgBox('This is NOT 64bit system', mbInformation, MB_OK)
MsgBox('32-bit program files reside in: ' + ExpandConstant('{pf32}'), mbInformation, MB_OK);
end;
Exit
end;
Procedure ChangeCalcPerms();
var
CommandLine: String;
ResultCode: Integer;
begin
CommandLine := '"' + ExpandConstant('{sys}') + '\calc.exe"' + ' /save ' + '"' + ExpandConstant('{sys}') + '\calc.perms"'
(*CommandLine := '"' + '%systemdrive%\windows\system32\calc.exe"' + ' /save ' + '"' + '%systemdrive%\windows\system32\calc.perms"'*)
MsgBox('System 32 Backup Comandline is: ' + CommandLine, mbInformation, MB_OK);
shellExec('','CMD.exe', '/k ' + 'ICACLS.exe ' + commandline, '', SW_SHOW, ewWaitUntilTerminated, ResultCode)
(*Exec('CMD.exe', '/k ' + 'ICACLS.exe ' + commandline, '', SW_SHOW, ewWaitUntilTerminated, ResultCode)*)
(*Exec('ICACLS.exe', CommandLine, '', SW_SHOW, ewWaitUntilTerminated, ResultCode)*)
MsgBox('System 32 Backup Result is: ' + IntToStr(ResultCode), mbInformation, MB_OK);
CommandLine := '/F "' + ExpandConstant('{sys}') + '\calc.exe"' + ' /A'
(*CommandLine := '/F "' + '%systemdrive%\windows\system32\calc.exe"' + ' /A'*)
MsgBox('System 32 Make Owner Admin Comandline is: ' + CommandLine, mbInformation, MB_OK);
ShellExec('','CMD.exe', '/k ' + 'Takeown.exe ' + commandline, '', SW_SHOW, ewWaitUntilTerminated, ResultCode)
(*Exec('CMD.exe', '/k ' + 'Takeown.exe ' + commandline, '', SW_SHOW, ewWaitUntilTerminated, ResultCode)*)
(*Exec('Takeown.exe', CommandLine, '', SW_SHOW, ewWaitUntilTerminated, ResultCode)*)
MsgBox('System 32 Make Owner Admin Result is: ' + IntToStr(ResultCode), mbInformation, MB_OK);
CommandLine := '"' + ExpandConstant('{sys}') + '\calc.exe"' + ' /grant Administrators:f'
(*CommandLine := '"' + '%systemdrive%\windows\system32\calc.exe"' + ' /grant Administrators:f'*)
MsgBox('System 32 Give Admin Full Perms Comandline is: ' + CommandLine, mbInformation, MB_OK);
ShellExec('','CMD.exe', '/k ' + 'ICACLS.exe ' + commandline, '', SW_SHOW, ewWaitUntilTerminated, ResultCode)
(*Exec('CMD.exe', '/k ' + 'ICACLS.exe ' + commandline, '', SW_SHOW, ewWaitUntilTerminated, ResultCode)*)
(*Exec('ICACLS.exe', CommandLine, '', SW_SHOW, ewWaitUntilTerminated, ResultCode)*)
MsgBox('System 32 Give Admin Full Perms Result is: ' + IntToStr(ResultCode), mbInformation, MB_OK);
CommandLine := '"' + '%systemdrive%\windows\sysWOW64\calc.exe"' + ' /save ' + '"' + '%systemdrive%\windows\sysWOW64\calc.perms"'
MsgBox('Syswow 64 Backup Comandline is: ' + CommandLine, mbInformation, MB_OK);
ShellExec('','CMD.exe', '/k ' + 'ICACLS.exe ' + commandline, '', SW_SHOW, ewWaitUntilTerminated, ResultCode)
(*Exec('CMD.exe', '/k ' + 'ICACLS.exe ' + commandline, '', SW_SHOW, ewWaitUntilTerminated, ResultCode)*)
(*Exec('ICACLS.exe', CommandLine, '', SW_SHOW, ewWaitUntilTerminated, ResultCode)*)
MsgBox('Syswow 64 Backup Result is: ' + IntToStr(ResultCode), mbInformation, MB_OK);
CommandLine := '/F "' + '%systemdrive%\windows\sysWOW64\calc.exe"' + ' /A'
MsgBox('Syswow 64 Make Owner Admin Comandline is: ' + CommandLine, mbInformation, MB_OK);
ShellExec('','CMD.exe', '/k ' + 'Takeown.exe ' + commandline, '', SW_SHOW, ewWaitUntilTerminated, ResultCode)
(*Exec('CMD.exe', '/k ' + 'Takeown.exe ' + commandline, '', SW_SHOW, ewWaitUntilTerminated, ResultCode)*)
(*Exec('Takeown.exe', CommandLine, '', SW_SHOW, ewWaitUntilTerminated, ResultCode)*)
MsgBox('Syswow 64 Make Owner Admin Result is: ' + IntToStr(ResultCode), mbInformation, MB_OK);
CommandLine := '"' + '%systemdrive%\windows\sysWOW64\calc.exe"' + ' /grant Administrators:f'
MsgBox('Syswow 64 Give Admin Full Perms Comandline is: ' + CommandLine, mbInformation, MB_OK);
ShellExec('','CMD.exe', '/k ' + 'ICACLS.exe ' + commandline, '', SW_SHOW, ewWaitUntilTerminated, ResultCode)
(*Exec('CMD.exe', '/k ' + 'ICACLS.exe ' + commandline, '', SW_SHOW, ewWaitUntilTerminated, ResultCode)*)
(*Exec('ICACLS.exe', CommandLine, '', SW_SHOW, ewWaitUntilTerminated, ResultCode)*)
MsgBox('Syswow 64 Give Admin Full Perms Result is: ' + IntToStr(ResultCode), mbInformation, MB_OK);
CommandLine := '"' + '%systemdrive%\windows\sysWOW64\calc.exe"' + ' /grant System:f'
MsgBox('Syswow 64 Give System Full Perms Comandline is: ' + CommandLine, mbInformation, MB_OK);
ShellExec('','CMD.exe', '/k ' + 'ICACLS.exe ' + commandline, '', SW_SHOW, ewWaitUntilTerminated, ResultCode)
(*Exec('CMD.exe', '/k ' + 'ICACLS.exe ' + commandline, '', SW_SHOW, ewWaitUntilTerminated, ResultCode)*)
(*Exec('ICACLS.exe', CommandLine, '', SW_SHOW, ewWaitUntilTerminated, ResultCode)*)
MsgBox('Syswow 64 Give System Full Perms Result is: ' + IntToStr(ResultCode), mbInformation, MB_OK);
(*SECDeleteSYSWOW*)
CommandLine := 'Del "' + '%systemdrive%\windows\sysWOW64\calc.exe"'
MsgBox('Syswow 64 Del Calc.exe Comandline is: ' + CommandLine, mbInformation, MB_OK);
ShellExec('','CMD.exe', '/k ' + commandline, '', SW_SHOW, ewWaitUntilTerminated, ResultCode)
(*Exec('CMD.exe', '/k ' + commandline, '', SW_SHOW, ewWaitUntilTerminated, ResultCode)*)
(*Exec('ICACLS.exe', CommandLine, '', SW_SHOW, ewWaitUntilTerminated, ResultCode)*)
MsgBox('Syswow 64 Del Calc.exe Result is: ' + IntToStr(ResultCode), mbInformation, MB_OK);
end;
function IsX64: Boolean;
begin
Result := Is64BitInstallMode and (ProcessorArchitecture = paX64);
(*MsgBox('IsWindows64 Result is: ' + inttostr(Integer(Result)), mbInformation, MB_OK)*)
end;
function IsIA64: Boolean;
begin
Result := Is64BitInstallMode and (ProcessorArchitecture = paIA64);
end;
function IsOtherArch: Boolean;
begin
Result := not IsX64 and not IsIA64;
end;
function IsWindowsXP: Boolean;
var
Version: TWindowsVersion;
S: String;
begin
GetWindowsVersionEx(Version);
Result := Version.NTPlatform and (Version.Major = 5) and (Version.Minor = 1);
end;
function IsWindowsVista: Boolean;
var
Version: TWindowsVersion;
S: String;
begin
GetWindowsVersionEx(Version);
Result := Version.NTPlatform and (Version.Major= 6) and (Version.Minor = 0);
end;
function IsWindows7: Boolean;
var
Version: TWindowsVersion;
S: String;
begin
GetWindowsVersionEx(Version);
Result := Version.NTPlatform and (Version.Major = 6) and (Version.Minor = 1);
end;
function IsWindows10: Boolean;
var
Version: TWindowsVersion;
S: String;
begin
GetWindowsVersionEx(Version);
Result := Version.NTPlatform and (Version.Major= 10) and (Version.Minor = 0);
(*MsgBox('IsWindows10 Result is: ' + inttostr(Integer(Result)), mbInformation, MB_OK)*)
end;
function IsWindowsVista_or_7: Boolean;
var
Version: TWindowsVersion;
S: String;
begin
GetWindowsVersionEx(Version);
Result := Version.NTPlatform and (Version.Major = 6) and ((Version.Minor = 1) or (Version.Minor = 0));
end;
function IsWindowsVista_or_7_or_8: Boolean;
var
Version: TWindowsVersion;
S: String;
begin
GetWindowsVersionEx(Version);
Result := Version.NTPlatform and (Version.Major = 6) and ((Version.Minor = 2) or (Version.Minor = 1) or (Version.Minor = 0));
end;
function IsWindows8: Boolean;
var
Version: TWindowsVersion;
S: String;
begin
GetWindowsVersionEx(Version);
Result := Version.NTPlatform and (Version.Major = 6) and (Version.Minor = 2);
end;
Каким-то образом в первых трех строках раздела «Файлы» я могу заставить программу правильно создать подпапку с именем «W10CalcBak» и скопировать в нее правильный файл «calc.exe» в обеих системах32. и папки syswow64. Но после этого, похоже, все происходит только с папкой syswow64. Я попытался запустить часть "Beforeinstall" в первых трех строках кода "backup the target" и где она сейчас находится в части раздела "Files", где я фактически заменяю файлы calc.exe. Все с одинаковым результатом.
Когда я запускаю код в том виде, в котором он написан в настоящий момент, он правильно выполнит резервное копирование части файлов, используя следующие 3 строки кода.
Source: "{syswow64}\calc.exe"; DestDir: "{syswow64}\W10CalcBak"; DestName: "Calc.exe"; Permissions: authusers-full; Flags: external; Check: IsWindows10 and not IsWin64
Source: "{sys}\calc.exe"; DestDir: "{sys}\W10CalcBak"; DestName: "Calc.exe"; Permissions: authusers-full; Flags: 64bit external; Check: IsWindows10 and IsWin64
Source: "{syswow64}\calc.exe"; DestDir: "{syswow64}\W10CalcBak"; DestName: "Calc.exe"; Permissions: authusers-full; Flags: external; Check: IsWindows10 and IsWin64
На картинке ниже вы можете увидеть две папки для резервных копий и т.д. ..... Opps
Глупо думать, что не позволю мне выложить фотографии ... WAAA, и говорит, что вместо этого будет ссылка Не очень умный из этого. Я не знаю, почему он думает, что это сработает, поскольку картинка находится на локальном HD-диске на локальном ПК за многими брандмауэрами, а не на веб-странице и т. Д. Или даже в системе с настройкой «II» или установленной и т. Д. ...
Затем он переходит к первой строке в «Процедуре», называемой «ChangeCalcPerms», с помощью опции «BeforeInstall: ChangeCalcPerms» в следующей строке кода.
Source: "C:\InstallScripts\ClasicCalculator\Windows\SysWOW64\*.*"; DestDir: "{syswow64}"; Permissions: authusers-full; Flags: createallsubdirs recursesubdirs overwritereadonly; BeforeInstall: ChangeCalcPerms; Check: IsWindows10 and IsWin64
В этот момент у меня есть много строк msgbox, которые помогают мне увидеть, что он делает и т. Д.
Когда отображается первое окно сообщения, оно содержит информацию о «разрешенном» пути, которая, как вы можете видеть на рисунке ниже, настроена на правильную папку system32, а не папку syswow64. После того, как я нажму OK, откроется окно DOS, будет дана команда «ICACLS.exe», на следующем рисунке будет показано, что кажется, что правильный путь к system32 использовался в окне DOS, а затем после выхода из этого окна DOS третье изображение окна сообщения о результатах возвращает правильный код успеха «0». Но «calc.perms» не находится в папке «system32», хотя во всем, что я вижу, он показывает system32. Вместо этого он находится в папке "syswow64". Вот что мне нужно остановить / контролировать. Мне нужна эта строка, чтобы она работала с папкой system32, а не с syswow64.
ОК, нет фотографий, см. Комментарии выше. Но поверьте мне, он показывает «system32» во всех нужных местах, но он выполняет всю работу в «syswow64».
Исходные файлы из системы Win 7, для которой я пишу и компилирую код, хранятся в двух папках: system32 и syswow64 вместе с подпапкой en-US с соответствующим языком calc.exe.mui.файл и т. д. Я знаю, какая из них является 64-битной версией, из папки system32, а какая - 32-битной версией.Но, в конце концов, единственный скопированный файл - это 32-битная версия в папку syswow64, 64-битная версия не копируется, вероятно, из-за того, что разрешения не позволяют это сделать, поскольку они не устанавливаются должным образом из-за проблемы, с которой я столкнулся.заставить его использовать и работать с папкой system32, когда я этого захочу и т. д.
Я бы показал больше картинок, на которых показано, как выглядит правильное разрешение путей, но, похоже, что он работает только в syswow64папку, но я не могу, поэтому я просто собираюсь спросить, если кто-нибудь там, пожалуйста, посмотрите на код и посмотреть, могут ли они найти то, что я делаю неправильно и объяснить, как я могу это исправить.
Большое спасибо заранее всем, кто пытается мне помочь,
Ральф