InstallShield Запуск от имени локальной учетной записи, если он не запущен администратором

У меня есть проект InstallShield InstallScript, который необходимо запустить с правами администратора. В двух словах от InstallShield мне нужно:

  1. Определите, есть ли у установщика права администратора.
  2. Если setup.exe не запускается с правами администратора, создайте новый экземпляр setup.exe, используя локальную учетную запись/пароль администратора, а затем закройте старый (непривилегированный) setup.exe.

Пока я знаю, что могу сделать что-то подобное, чтобы узнать, есть ли у меня права администратора:

//---------------------------------------------------------------------------                                                                        
// Run As Utilities Library
//---------------------------------------------------------------------------
// Include Ifx.h for built-in InstallScript function prototypes.
#include "Ifx.h"
//---------------------------------------------------------------------------

export prototype UserRightsCheck();
function UserRightsCheck()
begin
MessageBox(INSTALLPROPERTY_INSTALLLOCATION, INFORMATION);
    if(USER_ADMINISTRATOR) then
        MessageBox("hello Admin", INFORMATION); // testing only
        // do nothing we are an admin

    else
        MessageBox("hello user", SEVERE); // testing only
        RunAsAdmin();
    endif;
end;


export prototype RunAsAdmin();
function RunAsAdmin()
begin
    STRING username = "myUserID";
    STRING password = "myPassword";
    STRING filepath = INSTALLPROPERTY_INSTALLLOCATION;
    RunAsUserAccount(username,password,filepath);
end;

export prototype RunAsUserAccount();
function RunAsUserAccount()
STRING username;
STRING password;
STRING filepath;
begin
    /*
    Is this the best way to do this? this is the function I need help with
    This seems like a hack
    */
    if ( SYSINFO.WINNT.bWinXP ) then
        LAAW_SHELLEXECUTEVERB = "open"; // target PC is on Windows XP
    else
        LAAW_SHELLEXECUTEVERB = "runas"; // Windows 7 (or Vista)
    endif;     

    LaunchApplication(
        filepath
        ,"" // Arguments
        ,"" // Directory
        ,SW_NORMAL // Use Window Mode
        ,0
        ,LAAW_OPTION_WAIT_INCL_CHILD | LAAW_OPTION_USE_SHELLEXECUTE
    );
end;

Как перезапустить установщик? Это можно сделать в Wise Package Studio и многих других инструментах, но я пока не нашел ответа, как это сделать в этом.

Я знаю, что мог бы, вероятно, сделать runas.exe или psexec.exe, но это похоже на взлом и звучит как плохая практика. Примерно через день чтения я все еще не уверен, как это сделать.

Может ли кто-нибудь указать мне правильное направление правильного способа сделать это в InstallShield?


person Dave    schedule 23.07.2014    source источник
comment
Installscript MSI почти пугающе глючит. Почему вы используете этот тип проекта? Возможно, вы используете чистый Installscript? Другими словами, это вообще не установка MSI?   -  person Stein Åsmul    schedule 23.07.2014
comment
Правильный; мы не развертываем MSI, мы развертываем внутреннее приложение с кучей связанных «свободных» файлов.   -  person Dave    schedule 23.07.2014
comment
Обратите внимание, что if(USER_ADMINISTRATOR) ... неверно. USER_ADMINISTRATOR — это константа, которую необходимо передать в Is. например: if(Is(USER_ADMINISTRATOR)) ...   -  person Michael Urman    schedule 24.07.2014
comment
Спасибо, Майкл; отредактирует код в посте.   -  person Dave    schedule 28.07.2014


Ответы (2)


Скажите пользователю в MessageBox перезапустить установку с правами администратора. Объясните, что они могут сделать это, щелкнув правой кнопкой мыши файл setup.exe в Проводнике, а затем выбрав "запуск от имени администратора", а затем "ОК" в командной строке UAC. Это концептуально «чистый» способ сделать это, поскольку вы не делаете ничего неожиданного.

Как я уже говорил в комментарии выше, дважды подумайте о Installscript MSI. Это очень глючит. Лучшим вариантом является Basic MSI с кодом настраиваемого действия Installscript.

Базовый MSI — это стандартный MSI, а настраиваемые действия сценария установки не мешают графическому интерфейсу установки или общей работе MSI. В Installscript MSI вся последовательность установки контролируется Installscript, что приводит к серьезным ошибкам, некоторые из которых не имеют обходных путей или исправлений (даже спустя годы после их обнаружения).

person Stein Åsmul    schedule 23.07.2014
comment
Мы не развертываем MSI, просто базовый InstallScript. Развертывание как MSI также не вариант. Щелчок правой кнопкой мыши по задаче для ввода учетных данных также не вариант... это очень плохой способ что-то сделать, когда задача развертывания автоматизирована. - person Dave; 23.07.2014
comment
Как задача развертывания будет автоматизирована? Правильный способ сделать это — использовать систему развертывания, такую ​​как SCCM, но я предполагаю, что она недоступна? Такие инструменты обеспечивают запуск setup.exe с правами администратора, что, по словам эксперта Installscript (не я), ... всегда требуется для установки Installscript. См. его Основные вопросы и ответы. - person Stein Åsmul; 23.07.2014
comment
Помните, что для каждой версии Windows создаются новые препятствия для развертывания. Избавьте себя от многих проблем и сделайте все правильно, без каких-либо хаков внутри установки. Просто прервите его, если он запущен без прав администратора. - person Stein Åsmul; 23.07.2014
comment
Наоборот, смешно, когда люди предлагают развертывать программное обеспечение для множества пользователей, заставляя техников вручную устанавливать каждую коробку для его установки. Общепринятой практикой является переупаковка приложений со встроенной учетной записью локальной службы с правами администратора, а затем развертывание программного обеспечения с помощью автоматизированного инструмента, такого как Altiris, KACE, LanDesk и т. д. - person Dave; 24.07.2014
comment
Это то, что я написал выше с SCCM? Я предложил не ручную установку, а прервал установку, если она запускается без прав администратора в интерактивном режиме, и использовал средство развертывания, такое как SCCM, для запуска установки с надлежащими правами администратора для крупномасштабного развертывания. - person Stein Åsmul; 24.07.2014
comment
Учетные данные должны быть упакованы в установщик, поскольку он развертывается для людей несколькими способами. Это означает, что если кто-то загрузит его с сайта интрасети, развернет с помощью инструмента или его подтолкнет технический специалист, он должен надежно работать с теми же учетными данными. - person Dave; 28.07.2014

Возможно, это похоже на то, что вы ищете: Как могу ли я запустить программу установки от имени администратора. Также проверьте это.

Если вы используете MSI вместо Installscript и используете встроенную концепцию MSI с повышенными правами, вы можете использовать свойства MSI, установленные в командной строке, для установки в любом месте с повышенными правами: msiexec /i MySetup.MSI USER=OneUser /PASS=PassWord /qn. Просто констатирую, что возможно и, возможно, проще.

person Stein Åsmul    schedule 29.07.2014