Заставьте Inno Setup использовать system32 и / или syswow64, как указано вслепую - PullRequest
0 голосов
/ 11 мая 2018

Мне нужна помощь с настройкой 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папку, но я не могу, поэтому я просто собираюсь спросить, если кто-нибудь там, пожалуйста, посмотрите на код и посмотреть, могут ли они найти то, что я делаю неправильно и объяснить, как я могу это исправить.

Большое спасибо заранее всем, кто пытается мне помочь,

Ральф

1 Ответ

0 голосов
/ 11 мая 2018

Спасибо, Миртеил, Москито и Мартин за вашу помощь,

Мирту,

Спасибо за предложение о том, как разместить мои изображения. Поскольку предложение Мартина привело к ответу, я не думаю, что мне нужно будет публиковать снимки экрана, но еще раз спасибо за идею.

Москито,

Хотя это и не рекомендуется, вы действительно можете перезаписать системный файл. Вам просто нужно взять на себя ответственность и предоставить себе полный контроль над файлом. Мой проект делает именно это, вызывая системные программы, такие как ICACLS.exe и TakeOwn.exe, найденные в ОС Windows. Это можно сделать в файле .bat. Вы должны иметь права администратора, но это может быть сделано. Еще раз спасибо за попытку помочь.

Мартину Прикрылу

СПАСИБО! Ваше предложение об использовании функции EnableFsRedirection и опубликованных вами ссылок о ней и о том, как ее использовать, привело меня к решению.

Решение потребовало 3 изменения в моем коде.

  1. Мне пришлось использовать функцию, чтобы отключить перенаправление файлов перед выполнением любых команд для файла / папки "system32".

  2. Мне пришлось изменить свой код "пути" с использования встроенных констант Inno Setup {sys} и {syswow64} на использование переменной среды Windows / DOS% systemdrive%, чтобы получить букву основного диска и затем используйте «\ windows \ system32» для завершения пути. Если я использовал константу {sys}, она все равно перенаправляла мой вызов system32 на syswow64.

  3. Мне пришлось вернуться к использованию функции «Exec» вместо функции «ShellExec» для выполнения моих «вызовов» в ICACLS.exe и Takeown.exe. Если я использовал «ShellExec», система все равно перенаправляла мои вызовы system32 на syswow64.

Мне также пришлось внести некоторые коррективы в мой раздел файлов, чтобы завершить установку части этого проекта, в основном в порядке строк «Sourece» и когда я вызвал процедуру «ChangeCalcPerms», и я вышел из одной «Звезды» .Star "стиль копирования моих" новых "файлов в папку system32 и syswow64 и подпапку" en-US "для файлов .mui с использованием отдельной строки кода для каждого из четырех файлов, которые мне нужно было поместить в «системные» папки. Это было необходимо, потому что функции BeforeInstall / AfterInstall будут запускаться для каждого файла в вызове типа «Star.Star», и это приводило к тому, что моя процедура запускалась дважды, что не было предназначено, и вызывало ли это проблемы. (Пытался использовать символ * в «Star.Star», но, похоже, он имел особое значение и испортил внешний вид этого ответа)

Последнее, что мне нужно сделать, чтобы завершить часть «Установка» этого проекта, - это взять «новые» файлы calc.exe из Win 7, которые я использовал для замены версий Win 10, и восстановить оригинальные разрешения на них для их защиты. Я планирую добавить новую процедуру, которую я буду вызывать, используя опцию «AfterInstall», и я добавлю ее в последнюю строку кода в разделе моих файлов.

Как только я добавлю эту последнюю часть и протестирую ее, я удалю все окна сообщений, и установка части проекта должна быть завершена.

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

Я оставлю в окнах сообщений и т. Д. В своей процедуре и просто скажу тем, кто хочет использовать этот код, не забывать комментировать их и изменить "/ k" на "/ c" в частях "Exec" кода, так что код будет выполняться без взаимодействия с пользователем.

Раздел Мои исправленные файлы .....

[Files]

; This section backs up the calc.exe files

; This line is for x86 systems only
Source: "{sys}\calc.exe"; DestDir: "{sys}\W10CalcBak"; DestName: "Calc.exe"; Permissions: authusers-full; Flags: external; Check: IsWindows10 and (not IsWin64)

; The next two lines are for x64 systems
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


; This section modifies the permisions and then deletes the calc.exe files then replaces them

; Next two lines are for x86 systems only

Source: "C:\InstallScripts\ClasicCalculator\Windows\SysWOW64\calc.exe"; DestDir: "{sys}"; Permissions: authusers-full; Flags: createallsubdirs recursesubdirs overwritereadonly; BeforeInstall: ChangeCalcPerms; Check: IsWindows10 and (not IsWin64)

Source: "C:\InstallScripts\ClasicCalculator\Windows\SysWOW64\en-US\calc.exe.mui"; DestDir: "{sys}\en-US"; Permissions: authusers-full; Flags: createallsubdirs recursesubdirs overwritereadonly; Check: IsWindows10 and (not IsWin64)

; Next four lines are for x64 systems only

Source: "C:\InstallScripts\ClasicCalculator\Windows\System32\calc.exe"; DestDir: "{sys}"; Permissions: authusers-full; Flags: 64bit createallsubdirs recursesubdirs overwritereadonly; BeforeInstall: ChangeCalcPerms; Check: IsWindows10 and IsWin64

Source: "C:\InstallScripts\ClasicCalculator\Windows\System32\en-US\calc.exe.mui"; DestDir: "{sys}\en-US"; Permissions: authusers-full; Flags: 64bit createallsubdirs recursesubdirs overwritereadonly; Check: IsWindows10 and IsWin64

Source: "C:\InstallScripts\ClasicCalculator\Windows\SysWOW64\calc.exe"; DestDir: "{syswow64}"; Permissions: authusers-full; Flags: createallsubdirs recursesubdirs overwritereadonly; Check: IsWindows10 and IsWin64

Source: "C:\InstallScripts\ClasicCalculator\Windows\SysWOW64\en-US\calc.exe.mui"; DestDir: "{syswow64}\en-US"; Permissions: authusers-full; Flags: createallsubdirs recursesubdirs overwritereadonly; Check: IsWindows10 and IsWin64

А вот моя исправленная Процедура из моего раздела Кодекса.

[Code]

Procedure ChangeCalcPerms();

var
  OldState: Boolean;
  NewState: Boolean;
  CommandLine: String;
  ResultCode: Integer;

begin

  // Test to see if x64 system, if so disable FS Redirection..

  if IsWin64 then

  begin

  Msgbox('The system is x64, turning off the FS Redirection',mbInformation, MB_OK);

  //Turn of redirection

  OldState := EnableFsRedirection(False);

  Msgbox('The system is x64, turning off the FS Redirection, OldState = ' + inttostr(Integer(OldState)) ,mbInformation, MB_OK);

  end;

  // Start of x64 and x86 as both have system32 folder

  // Backup perms for system32\calc.exe

CommandLine := '"' + '%systemdrive%\windows\system32\calc.exe"' + ' /save ' + '"' + '%systemdrive%\windows\system32\calc.perms"'

  MsgBox('System 32 Backup Comandline is: ' + CommandLine, mbInformation, MB_OK);

 Exec('CMD.exe', '/k ' + 'ICACLS.exe ' + commandline, '', SW_SHOW, ewWaitUntilTerminated, ResultCode)

  MsgBox('System 32 Backup Result is: ' + IntToStr(ResultCode), mbInformation, MB_OK);

 // Change Owner to Administrators

  CommandLine := '/F "' + '%systemdrive%\windows\system32\calc.exe"' + ' /A'

  MsgBox('System 32 Make Owner Admin Comandline is: ' + CommandLine, mbInformation, MB_OK);

  Exec('CMD.exe', '/k ' + 'Takeown.exe ' + commandline, '', SW_SHOW, ewWaitUntilTerminated, ResultCode)

  MsgBox('System 32 Make Owner Admin Result is: ' + IntToStr(ResultCode), mbInformation, MB_OK);

  // Grant Administrators full control

 CommandLine := '"' + '%systemdrive%\windows\system32\calc.exe"' + ' /grant Administrators:f'

  MsgBox('System 32 Give Admin Full Perms Comandline is: ' + CommandLine, mbInformation, MB_OK);

Exec('CMD.exe', '/k ' + 'ICACLS.exe ' + commandline, '', SW_SHOW, ewWaitUntilTerminated, ResultCode)

MsgBox('System 32 Give Admin Full Perms Result is: ' + IntToStr(ResultCode), mbInformation, MB_OK);

 // Grant System Full Control

CommandLine := '"' + '%systemdrive%\windows\system32\calc.exe"' + ' /grant System:f'

  MsgBox('System 32 Give System Full Perms Comandline is: ' + CommandLine, mbInformation, MB_OK);

Exec('CMD.exe', '/k ' + 'ICACLS.exe ' + commandline, '', SW_SHOW, ewWaitUntilTerminated, ResultCode)

  MsgBox('System 32 Give System Full Perms Result is: ' + IntToStr(ResultCode), mbInformation, MB_OK);

 // Delete calc.exe in system32 folder

  CommandLine := 'Del "' + '%systemdrive%\windows\system32\calc.exe"'

  MsgBox('System32 Del Calc.exe Comandline is: ' + CommandLine, mbInformation, MB_OK);

 Exec('CMD.exe', '/k ' + commandline, '', SW_SHOW, ewWaitUntilTerminated, ResultCode)


  // Start of x64 part *************

if IsWin64 then

  Begin

    // Backup perms for syswow64\calc.exe

    CommandLine := '"' + '%systemdrive%\windows\sysWOW64\calc.exe"' + ' /save ' + '"' + '%systemdrive%\windows\sysWOW64\calc.perms"'

    MsgBox('Syswow 64 Backup Comandline is: ' + CommandLine, mbInformation, MB_OK);

 (Exec('CMD.exe', '/k ' + 'ICACLS.exe ' + commandline, '', SW_SHOW, ewWaitUntilTerminated, ResultCode)

    MsgBox('Syswow 64 Backup Result is: ' + IntToStr(ResultCode), mbInformation, MB_OK);

    // Change Owner to Administrators

    CommandLine := '/F "' + '%systemdrive%\windows\sysWOW64\calc.exe"' + ' /A'

    MsgBox('Syswow 64 Make Owner Admin Comandline is: ' + CommandLine, mbInformation, MB_OK);

   Exec('CMD.exe', '/k ' + 'Takeown.exe ' + commandline, '', SW_SHOW, ewWaitUntilTerminated, ResultCode)

   MsgBox('Syswow 64 Make Owner Admin Result is: ' + IntToStr(ResultCode), mbInformation, MB_OK);

    // Grant Administrators full control

    CommandLine := '"' + '%systemdrive%\windows\sysWOW64\calc.exe"' + ' /grant Administrators:f'

    MsgBox('Syswow 64 Give Admin Full Perms Comandline is: ' + CommandLine, mbInformation, MB_OK);

    Exec('CMD.exe', '/k ' + 'ICACLS.exe ' + commandline, '', SW_SHOW, ewWaitUntilTerminated, ResultCode)

    MsgBox('Syswow 64 Give Admin Full Perms Result is: ' + IntToStr(ResultCode), mbInformation, MB_OK);

    // Grant System full control

    CommandLine := '"' + '%systemdrive%\windows\sysWOW64\calc.exe"' + ' /grant System:f'

    MsgBox('Syswow 64 Give System Full Perms Comandline is: ' + CommandLine, mbInformation, MB_OK);

 Exec('CMD.exe', '/k ' + 'ICACLS.exe ' + commandline, '', SW_SHOW, ewWaitUntilTerminated, ResultCode)

    MsgBox('Syswow 64 Give System Full Perms Result is: ' + IntToStr(ResultCode), mbInformation, MB_OK);

    // Del calc.exe in Syswow64 folder

    CommandLine := 'Del "' + '%systemdrive%\windows\sysWOW64\calc.exe"'

    MsgBox('Syswow 64 Del Calc.exe Comandline is: ' + CommandLine, mbInformation, MB_OK);

    Exec('CMD.exe', '/k ' + commandline, '', SW_SHOW, ewWaitUntilTerminated, ResultCode)

    MsgBox('Syswow 64 Del Calc.exe Result is: ' + IntToStr(ResultCode), mbInformation, MB_OK);

    end;


  if IsWin64 then

  begin

  //Turn on redirection

  Msgbox('The system is x64, turning On the FS Redirection',mbInformation, MB_OK);

  NewState := EnableFsRedirection(OldState);

  Msgbox('The system is x64, turning On the FS Redirection, NewState = ' + inttostr(Integer(NewState)) ,mbInformation, MB_OK);

  end;


end;

Надеюсь, это поможет кому-то еще, кому нужно делать подобные вещи.

Следующим шагом является получение части «Удалить» этой работы.

СПАСИБО !!!! еще раз всем тем, кто пытался помочь, И СДЕЛАЛ!

Ralph

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...