在Delphi中请求驱动程序安装的管理员权限

时间:2016-02-26 10:12:24

标签: delphi shellexecute silent-installer admin-rights

我想在自编安装程序中安装Microsoft SQL Server Native Client。数据库驱动程序将在首次启动时安装一次。

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

如果我的程序没有以管理员身份运行,我会在ShellExecute管理员权限中使用“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”的错误评估。当然它在我的代码中添加了。但我没有得到任何错误代码。

有没有人知道为什么安装在使用管理员权限启动程序时有效,而不是在它自己请求管理员权限时?

如果以管理员权限启动程序,则不会显示驱动程序安装的管理员权限的第二条消息。

问题:如何确保始终执行安装程序,并且我的程序不需要以管理员权限启动?

2 个答案:

答案 0 :(得分:1)

有两种可能出现这种情况的方案

  1. 管理员帐户无法访问该路径。典型的从映射的网络驱动器运行时,管理员帐户不知道映射。

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

  3. 使用命令行参数 / qn ,您可以隐藏安装程序中的任何输出,包括失败。对于调试,您可以切换到 / 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';
    

答案 1 :(得分:0)

我建议您将Admin清单嵌入到安装程序中(请参阅下面的链接),因此它会一直运行。

在您的情况下,您只检查ShellExecute的结果代码,但不检查msiexec.exe,因此安装程序可以正常启动,但在安装过程中会失败。您需要检查msiexec.exe本身的结果代码:

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

GetExitCodeProcess(shExInfo.hProcess,rslt);

现在分析msiexec.exe结果代码以确定它已成功安装。