У меня есть проект InstallShield InstallScript, который необходимо запустить с правами администратора. В двух словах от InstallShield мне нужно:
- Определите, есть ли у установщика права администратора.
- Если 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?
if(USER_ADMINISTRATOR) ...
неверно.USER_ADMINISTRATOR
— это константа, которую необходимо передать вIs
. например:if(Is(USER_ADMINISTRATOR)) ...
- person Michael Urman   schedule 24.07.2014