【问题标题】:Requests for administrator privileges for driver installation in Delphi在 Delphi 中安装驱动程序的管理员权限请求
【发布时间】:2016-02-26 10:12:23
【问题描述】:

我想在自己编写的安装程序中安装 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

然后我给程序加上 Sleep (20000) 20 秒的时间,这样就可以进行安装了。在普通的快速计算机中,安装需要 2-4 秒,因此大尺寸的 20 秒应该不是问题。

为了清楚起见,我在帖子中省略了“rslt”的错误评估。当然,它已添加到我的代码中。但我没有收到任何错误代码。

有没有人知道为什么当程序以管理员权限启动时安装工作正常,但在它自己请求管理员权限时却不行?

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

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

【问题讨论】:

  • 重复主题。您可以检查您是否需要管理员权限,如果需要以管理员身份执行并等待安装完成...stackoverflow.com/questions/923350/…
  • 坏主意,安装应该在安装时发生,而不是在启动期间。编写一个单独的安装程序(需要管理员权限),但要确保实际应用程序可以使用用户权限运行。

标签: delphi shellexecute silent-installer admin-rights


【解决方案1】:

发生这种情况有两种可能的情况

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

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

使用命令行参数/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';

【讨论】:

    【解决方案2】:

    我建议您将 Admin manifest 嵌入到您的安装程序中(请参阅下面的链接),这样它就会始终在提升的状态下运行。

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

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

    GetExitCodeProcess(shExInfo.hProcess,rslt);
    

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

    【讨论】:

      猜你喜欢
      • 2018-05-01
      • 2014-02-08
      • 2012-12-30
      • 2011-12-01
      • 2019-09-25
      • 1970-01-01
      • 2016-06-05
      • 2021-07-27
      • 1970-01-01
      相关资源
      最近更新 更多