Programming Windows Maniacs - プログラミング ウィンドウズ マニアックス ■ ご利用に際して ■ 更新履歴 ■ お問い合わせ ■ このホームページについて  
ホーム >> OS >> Windows®Vista™ >> 管理者権限へ権限上昇をするプロセスを起動する際の問題

管理者権限へ権限上昇をするプロセスを起動する際の問題

  管理者権限へ権限上昇をするプロセスを起動する際、Windows®Vista™ Release Candidate2でも問題のあったバグです。
RTM版や製品版では未確認ですが、 修正されているかどうかテストのしようがないので、ここに記載します。

  スタンダード権限で動作する「ある実行ファイルA」が、権限上昇を必要とする「ある実行ファイルB」を実行する際は、注意が必要です。
  通常他のプロセスを実行する際は、CreateProcess () APIを使用すると思いますが、CreateProcess () APIは、権限上昇を必要とするプロセスを作成する際、稀に失敗することがあるのです。
  正直理由がわかりませんが、成功するときもあるので謎です。

  そこで、Explorer.exeは問題なく権限上昇で失敗せずに他プロセスの呼び出しができているので、同様にシェル系を使用すればいけるのでは?と思い作成してみたところ、問題なく動作しました(実際のところExplorer自体はシェルAPIをつかっていないのですが・・・)。 この対策で数タイトル製品出荷しており、実際にサポート問い合わせもきていませんので問題ないです。

  対処方法は、ShellExecute () APIShellExecuteEx () APIを使用し、Verbに"runas"を指定します。

以下、ShellExecuteの処理部分のみ抽出したソースコードになります。 省略していますが、権限上昇をキャンセルしたかどうかは ShellExecute 実行後に、GetLastError () APIを使用することによりわかります。

 

■ ShellExecute ()により権限上昇manifestが適用されたExeを実行するためのコード

// 省略...
    OSVERSIONINFO ovi;
    memset ( &ovi, 0, sizeof ( OSVERSIONINFO ) );
    ovi.dwOSVersionInfoSize = sizeof ( OSVERSIONINFO );
    GetVersionEx ( &ovi );

// Vistaのとき
    if ( 6 <= ovi.dwMajorVersion )
    {
    // 実行します
        HINSTANCE hInst = ShellExecute ( NULL, "runas", strPath.c_str (), strCmd.c_str (), strCurrentPath.c_str (), SW_HIDE );
        DWORD dwResult = ( DWORD ) hInst;
    // 成功したか?
        if ( 32 < dwResult )
        {
        // 成功
            return TRUE;
        }

    // 失敗
        return FALSE;
    }
// 以下省略...

  ■ ご利用に際して ■ 更新履歴 ■ お問い合わせ ■ このホームページについて Copyright © 2014 A.Morita