pslaboが試したことの記録

はてなダイヤリーからはてなブログに引っ越してきました

この日記は現在実行中の減量記録を含む個人的なメモとして始めましたが、最近はコンピュータやガジェット、ハック、セキュリティネタのほうがメインになっております。

はてなダイヤリー時代はカテゴリ分けが適当だったのですが、これはそのうち直します。


Windows向けのsudo的なコマンドをDelphiで書く

先日、こういう記事をポストしたのですが、ここで調べた内容に基づいて Delphi で sudo 的なコードを書いてみました。

pslabo.hatenablog.com

やりたいことは、別のコマンドを管理者権限で実行したいだけなので、Delphi コマンドラインアプリケーションのプロジェクトを選択し、ShellExecute を 'run as' で実行するだけの簡単な実装です。

実行するコマンドとパラメータを以下のように取得して ShellExecute に渡しています。

  • ParamStr(1) で実行すべきコマンド名が渡される
  • ParamStr(2) - ParamStr(ParamCount) にコマンドへの引数が入る

実際の実装はこちら。

program sudo;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  Windows,
  ShellAPI,
  System.SysUtils;

var
  LParamIndex: Integer;
  LCommand   : String;
  LParameters: String;
  LCurrentDir: String;
  LhInstance : HWND;
begin

  if ParamCount >= 1 then
    try
      LCommand := ParamStr(1);

      if ParamCount >= 2 then
        for LParamIndex := 2 to ParamCount do
          LParameters := LParameters + ParamStr(LParamIndex) + ' '
      else
        LParameters := '';

      LCurrentDir := ExtractFilePath(ParamStr(0));

      LhInstance := ShellExecute(
        0,
        'runas',
        PChar(LCommand),
        PChar(LParameters),
        PChar(LCurrentDir),
        SW_SHOW);
    except
      on E: Exception do
        Writeln(E.ClassName, ': ', E.Message);
    end;

end.