2016-02-26 13 views
-2

Я хочу установить собственный клиент Microsoft SQL Server в самозаверяющий установщик. Драйвер базы данных должен быть установлен один раз при первом запуске.Запросы на права администратора для установки драйвера в Delphi

Моя проблема в том, что на некоторых компьютерах установка драйвера не выполняется, если моя программа не работает как администратор.

Если моя программа не работает как администратор, я получаю «runas» в правах администратора ShellExecute. Появится запрос на права администратора, но затем на некоторых компьютерах установка драйвера не выполняется.

function shellExec (APath, AParameter: String) : Boolean; 
    rslt := ShellExecute (0, pChar('runas'), pChar(APath), pChar(AParameter), pChar(''), SW_SHOWNORMAL); 
    result := (rslt > 32); 
end; 

shellExec('msiexec.exe', '-i' + MsiInstaller + ' /qn IACCEPTSQLNCLILICENSETERMS=YES'); 
// MsiInstaller = Path to NativeClient-Installer 

Затем я даю программе спящий режим (20000) 20 секунд, так что установка может быть выполнена. В обычных быстрых компьютерах установка занимает 2-4 секунды, поэтому щедро рассчитанные 20 секунд не должны быть проблемой.

Для наглядности, оценка ошибки с "rslt" отсутствует здесь, в сообщении. Конечно, он добавлен в мой код. Но я не получаю никаких кодов ошибок.

Кто-нибудь знает, почему установка работает, когда программа запускается с правами администратора, но не когда она запрашивает сами права администратора?

Если программа запускается с правами администратора, для прав администратора для установки драйвера не отображается второе сообщение.

Вопрос: Как обеспечить, чтобы программа установки всегда выполнялась, и моя программа не должна запускаться с правами администратора?

+0

Дублированной темы. Вы можете проверить, нужны ли вам права администратора, выполнять как администратор, если необходимо, и ждать завершения установки ... http://stackoverflow.com/questions/923350/delphi-prompt-for-uac-elevation-when-needed/28572886# 28572886 – smooty86

+6

Плохая идея, установки должны происходить во время установки не во время запуска. Напишите отдельный установщик (который требует прав администратора), но убедитесь, что фактическое приложение может работать с правами пользователя. – Remko

ответ

0

Я предлагаю вам вставить манифест администратора в ваш установщик (см. Ссылку ниже), поэтому он будет работать всегда приподнятым.

В вашем случае вы проверяете только код результата ShellExecute, но не msiexec.exe, поэтому установщик может начать нормально, но сбой во время процесса установки. Вам нужно проверить код результата для самого msiexec.exe:

Прежде всего, используйте ShellExecuteEx и дождитесь завершения (не используйте сон!), Вы можете прочитать more about this solution. Перед закрытием ручки, вы можете прочитать код выхода:

GetExitCodeProcess(shExInfo.hProcess,rslt); 

Проанализируйте msiexec.exe код результата, чтобы решить, что успешно установлен.

1

Есть два возможных сценария, почему это могло произойти

  1. Путь не доступен для учетной записи администратора. Обычно при запуске с подключенного сетевого диска и сопоставлении неизвестно учетной записи администратора.

  2. Вы пытаетесь установить x86-версию собственного клиента на ОС x64. Вы не должны устанавливать клиент x86 на операционную систему x64 и клиент x64 на ОС x86.

С помощью параметра командной строки /дп скрыть любой выход из программы установки в том числе и не удается. Для отладки вы можете переключиться на /qb, который будет показывать небольшое окно прогресса при установке, а также сообщения об ошибках, если они возникнут.

Чтобы получить реальную версию операционной системы вызова GetNativeSystemInfo и проверить SYSTEM_INFO.wProcessorArchitecture

var 
    inf: SYSTEM_INFO; 
    plt: string; 
    msi: string; 

GetNativeSystemInfo(inf); 
case inf.wProcessorArchitecture of 
    PROCESSOR_ARCHITECTURE_INTEL: plt := 'x86'; 
    PROCESSOR_ARCHITECTURE_AMD64: plt := 'x64'; 
else 
    raise ENotSupportedException.Create('Platform not supported.'); 
end; 

msi := '<PathToNativeClient>\' + plt + '\sqlncli.msi';