-2

我想在自己编写的安装程序中安装 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”的错误评估。当然,它已添加到我的代码中。但我没有收到任何错误代码。

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

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

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

4

2 回答 2

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';
于 2016-02-27T00:13:43.393 回答
0

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

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

首先,使用 ShellExecuteEx 并等待终止(不要使用睡眠!),您可以阅读有关此解决方案的更多信息。在关闭句柄之前,您可以阅读退出代码:

GetExitCodeProcess(shExInfo.hProcess,rslt);

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

于 2016-02-26T21:56:40.667 回答