2008年7月18日

UACエレベーションを要求してプログラムを実行

コントロールパネルの"日付と時刻"のようにWindows VistaのUACの対象となるプログラムを起動するにはShellExecuteでverbにrunasを指定します。ただしWindows 2000/XPではrunasを指定できないので代わりにデフォルトを示すNULLを指定します。
uses
  Windows, SysUtils, ShellAPI;

function ExecChildProcessAsAdmin(const CommandLine: String;
                                 const Parameters: String): Boolean;
const
  CRunAs: String = 'runas';
var
  POperation: PChar;
begin

  if Win32MajorVersion >= 6 then
  begin
    POperation := PChar(CRunAs);
  end
  else
  begin
    POperation := nil;
  end;

Result := (ShellExecute(0,POperation,PChar(CommandLine),PChar(Parameters),
                        nil,SW_SHOWNORMAL) > 32);

end;

これでWindows Vistaでは画面がブラックアウトして確認のダイアログが表示されます。
ちなみにUACエレベーションを要求するrunasというverbは未だにundocumentedみたいです。

2008/11/17追記: ユーザが権限の昇格を拒否した場合、ShellExecuteはFALSE(0)を返し、GetLastErrorの値はERROR_CANCELLED(1223)となります。元ねたはAdvanced Windows 第5版 上 p.144

0 件のコメント: