2017-02-15 12 views
2

Я использую Inno Setup для установки документов/файлов, а не приложения, и это в первую очередь для пользователей Windows 7. Таким образом, мой DestDir основан на {userdocs}, так что все файлы будут установлены в папке ниже библиотеки документов этого пользователя.Inno Setup - доступ к непривилегированным папкам учетной записи из установщика, для которого требуются привилегии

Проблема возникает, когда я использую тот же установщик для установки шрифта TTF. Для этого требуются повышенные привилегии (admin или superuser). Проблема, которую я вижу, заключается в том, что если пользователь, не являющийся администратором, запускает установку, они правильно запрашиваются через UAC для пароля администратора/суперпользователя ... но в этот момент DestDir для установки изменяется в папку документов администратора, а не папке документов пользователя. Есть ли способ обойти это или предотвратить это?

Пример, не являющемуся администратором учетной записи Fre имеет путь документов:

C:\Users\Fred\My Documents\ 

И если я не включать TTF шрифт как часть установки, это то, что программа установки будет использовать в качестве базового пути для установки {userdocs}, и он отлично работает.

Если я DO включить TTF шрифт как часть установки с же, не являющимся администратором пользователем Fred, к тому времени завершения установки {userdocs} стал

C:\Users\AdminUser\My Documents\ 

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

Спасибо.

+0

Я добавил пример реализации. –

ответ

1

Создайте дочерний установщик для шрифтов с PrivilegesRequired=admin directive, который вы будете запускать из встроенного мастер-установки.

Мастер код инсталлятора будет как:

[Setup] 
PrivilegesRequired=lowest 

[Files] 
Source: "ttfsetup.exe"; DestDir: {tmp}; Flags: deleteafterinstall 

[Run] 
Filename: "{tmp}\ttfsetup.exe"; Parameters: /silent; StatusMsg: "Installing TTF fonts..." 

И, конечно, вы должны удалить инсталлятор ребенка от главного деинсталлятора.

Вы также можете убедиться, что пользователь не выполнил мастер-установщик с правами администратора явно. См. Мой ответ How to write to the user's My Documents directory with installer when the user used 'Run As Administrator'.

Другой способ реализации этого заключается в использовании ShellExec function с runas глагола выполнить повышенную внешнюю утилиту копирования (copy, xcopy, robocopy). См. Inno Setup - Register components as an administrator (он работает regsvr32, но концепция такая же).


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

Используйте ExecAsOriginalUser function.

Вам необходимо обменять путь между установщиками через временный файл, доступный для обеих учетных записей. Например. файл в {commondocs}, как видно из Inno Setup always installs into admin's AppData directory.

[Files] 
Source: "*.txt"; DestDir: "{code:GetUserDocumentsFolder}" 

[Code] 

var 
    UserDocumentsFolder: string; 

function GetUserDocumentsFolder(Params: string): string; 
begin 
    Result := UserDocumentsFolder; 
end; 

function InitializeSetup(): Boolean; 
var 
    TempFile: string; 
    Code: string; 
    Buf: TArrayOfString; 
    ResultCode: Integer; 
begin 
    Result := True; 

    TempFile := { some path accessible by both users }; 
    Code := 
    '[Environment]::GetFolderPath(''MyDocuments'') | ' + 
    'Out-File "' + TempFile + '" -Encoding UTF8'; 
    Log(Format('Executing: %s', [Code])); 
    if (not ExecAsOriginalUser('powershell.exe', Code, '', SW_HIDE, 
          ewWaitUntilTerminated, ResultCode)) or 
    (ResultCode <> 0) or 
    (not LoadStringsFromFile(TempFile, Buf)) then 
    begin 
    MsgBox('Failed to resolve user MyDocuments path', mbError, MB_OK); 
    Result := False; 
    end 
    else 
    begin 
    UserDocumentsFolder := Buf[0]; 
    Log(Format('User Documents path resolved to "%s"', [UserDocumentsFolder])); 
    end; 
end; 

Связанные дискуссиях:

+0

Первый вариант идеально подходит для моей ситуации. Большое спасибо. –

 Смежные вопросы

  • Нет связанных вопросов^_^