sh1’s diary

プログラミング、読んだ本、資格試験、ゲームとか私を記録するところ

C# デバイスマネージャーを開く(.NET 6)

.NET Framework 時代のデバイスマネージャーは、以下のようなコードで呼び出されていたと思います。

Process.Start("devmgmt.msc");

.NET6 や .NET7 が現れる現在だと上記のコードは例外が発生してエラーになります。

An error occurred trying to start process 'devmgmt.msc' with working directory 'C:\Users...\bin\Debug\net6.0-windows10.0.17763.0'. The specified executable is not a valid application for this OS platform.

指定された実行は、OS プラットフォームで有効なアプリケーションではありません、というような感じでしょうか。実際は、Windows OS で実行しているので「そんな馬鹿な!」って感じでエラーメッセージも十分機能しているとは言えない状態です。

解決

以下のコードを実行します。ただし、アプリケーションを「管理者」として実行する必要があります。

var processStartInfo = new ProcessStartInfo
{
    FileName = "mmc.exe",
    Arguments = "devmgmt.msc"
};

var process = new Process
{
    StartInfo = processStartInfo
};

process.Start();

従来は、特にアプリケーション権限のような要件は、必要としていなかったように思います。(違っていたらすいません。忘却しています)

なので、今回の問題の根本的な要点は、セキュリティ的な都合ではないかと思いました。確かに、どんなアプリケーションからでも mmc.exe のサービスに対して簡単にアクセスできてしまうというのは、セキュリティ的な視点では面白くないのかもしれないです。

プラスα

Process.Start() を呼び出す前に、アプリケーションが管理者の権限を有しているかどうかを確認して、管理者 (Administrator) のときだけコントロールを有効にする、または、実行を可能にするような安全対策をしておけばよいと思います。

    public bool HasRoleAdministrator
    {
        get
        {
            var identity = WindowsIdentity.GetCurrent();
            var principal = new WindowsPrincipal(identity);

            return principal.IsInRole(WindowsBuiltInRole.Administrator);
        }
    }

参考

[asin:B0997VW7K9:detail]