2016-02-26 128 views
-2

我想在自行编写的安装程序中安装Microsoft SQL Server Native Client。数据库驱动程序将在首次启动时安装一次。在Delphi中请求驱动程序安装的管理员权限

我的问题是,在某些计算机上,如果我的程序未以管理员身份运行,则不会执行驱动程序安装。

如果我的程序没有以管理员身份运行,我在ShellExecute Admin权限中使用'runas'。出现对管理权限的请求,但是在某些计算机上未执行驱动程序的安装。

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

我建议你将Admin清单嵌入到你的安装程序中(见下面的链接),所以它会始终运行。

就你而言,你只检查ShellExecute的结果代码,而不检查msiexec.exe,这样安装程序可以正常启动,但在安装过程中失败。您需要检查msiexec.exe本身的结果代码:

首先,使用ShellExecuteEx并等待终止(不要使用sleep!),您可以阅读more about this solution。 之前关闭手柄,你可以阅读退出代码:

GetExitCodeProcess(shExInfo.hProcess,rslt); 

现在分析msiexec.exe的结果代码来决定它成功安装。

1

有两种可能的情况为什么会发生

  1. 的路径不是管理员帐户访问。从映射的网络驱动器运行并且映射对于管理员帐户而言通常是未知的。

  2. 您尝试在x64操作系统上安装x86版本的本机客户端。您不得在x64操作系统上安装x86客户端,在x86操作系统上安装x64客户端。

通过命令行参数/QN隐藏从安装程序,包括未通过任何输出。对于调试,您可以切换到/qb,安装时只显示一个小进度窗口,如果发生错误消息也会显示。

要获得真正的OS版本调用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';