-2

Microsoft SQL Server Native Client を自作のインストーラーでインストールしたいと考えています。データベース ドライバは、最初の起動時に 1 回インストールされます。

私の問題は、一部のコンピューターでは、プログラムが管理者として実行されていない場合、ドライバーのインストールが実行されないことです。

プログラムが管理者として実行されていない場合、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 番目のメッセージは表示されません。

質問: インストーラーが常に実行され、管理者権限でプログラムを起動する必要がないようにするにはどうすればよいですか?

4

2 に答える 2

1

これが発生する理由として 2 つのシナリオが考えられます

  1. 管理者アカウントはパスにアクセスできません。マップされたネットワーク ドライブから実行し、そのマッピングが管理者アカウントに認識されていない場合によく発生します。

  2. x64 OS に x86 バージョンのネイティブ クライアントをインストールしようとしました。x86 クラ​​イアントを x64 OS にインストールしたり、x64 クライアントを x86 OS にインストールしたりしないでください。

コマンドライン パラメーター/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';
于 2016-02-27T00:13:43.393 に答える