single.php

C# Process.Startでメモ帳を起動する際にアクセスが拒否されました。]が発生する場合の対処法

Visual StudioのC#で[Process.Start]を利用して外部プログラムのメモ帳[notepad.exe]を起動する際に “例外が発生しました。 An error occurred trying to start process ‘notepad.exe’ with working directory ‘…\bin\Debug\net10.0-windows’. アクセスが拒否されました。” が表示された場合の対処法について備忘録的に投稿します。

アプリ実行エイリアスのアプリで発生

Windows11にインストールされているテキストエディターのメモ帳[notepad.exe]は以前のバージョンから利用されてきた実行可能アプリと、UWPでインストールされているアプリの2種類があります。

アプリ実行エイリアスは、Windows11の[設定|アプリ|アプリの詳細設定|アプリ実行エイリアス]画面で確認できます。

一覧に表示されているアプリは、別名で呼び出されても[アプリ実行エイリアス]に追加されているアプリが起動される仕組みになっています。

例えば、[C:\Windows\System32\notepad.exe]が従来版のメモ帳を起動する場所ですが[アプリ実行エイリアス]が設定されていためUWP版のメモ帳が起動します。

アクセス拒否されました

原因は分かりませんが、今まで次のコードでメモ帳が起動していた処理で例外が発生するようになりました。

System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo
{
    FileName = "notepad.exe"
});

実際には、他のオプションも含まれていますが分かりやすいように省略しています。

エラーの内容を確認してみると次の通り。

“例外が発生しました。 An error occurred trying to start process ‘notepad.exe’ with working directory ‘…\bin\Debug\net10.0-windows’. アクセスが拒否されました。”

とにかく、アクセスが拒否られているようです。調べてみると、Windows11のアップデートでアプリの実行に関してセキュリティのハードルが上がったらしく、その影響なのかもしれません。

以下に私が試した対処法を記載しておきます。

コマンドプロンプトの引数で渡す

“cmd.exe” の引数で “notepad.exe” を受け渡して起動します。

System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo
{
    FileName = "cmd.exe",
    Arguments = "/c start notepad.exe",
    CreateNoWindow = true,
    UseShellExecute = true
});

Win32[SHELLEXECUTE]関数を使う

Process.Startは使わずにWin32APIの”ShellExecute” 関数で起動します。

var result = ShellExecute(IntPtr.Zero, "open", "notepad.exe", null, null, 1);

[DllImport("shell32.dll", CharSet = CharSet.Auto)]
static extern IntPtr ShellExecute(
    IntPtr hwnd,
    string lpOperation,
    string lpFile,
    string? lpParameters,
    string? lpDirectory,
    int nShowCmd);

ショートカットを使う

直接アプリを起動するとエラーになるので、ショートカットを経由して起動します。

具体的には次の手順で行います。

1. Windowsエクスプローダーでショートカットを保存する場所に移動して、右クリックして表示された[新規作成|ショートカット]メニューを選択します。

2. 表示された[ショートカットの作成]画面で[項目の場所を入力してください]に次の内容をを入力(または参照で選択)します。

C:\Windows\System32\notepad.exe

3. [次へ]をクリックします。

4.[ショートカット]の名前を入力して[完了]をクリックします。

5. ショートカットが保存されます。

作成したショートカットを “ShellExecute” などで実行します。

var result = ShellExecute(IntPtr.Zero, "open", @"notepad.exe.lnk", null, null, 1);

まとめ

[Process.Start]を利用して外部プログラムのメモ帳[notepad.exe]を起動する際に “例外が発生しました。 An error occurred trying to start process ‘notepad.exe’ with working directory ‘…\bin\Debug\net10.0-windows’. アクセスが拒否されました。” が表示された場合の対処法について書きました。

直接の原因は分かりませんが、私の場合は今まで動作していたコードが何かの更新で動作しなくなった可能性があります。

対処法としては、作成したショートカットをWin32 APIで実行することでエラーを回避できました。

Visual Studioで[Process.Start]を利用して外部プログラムのメモ帳[notepad.exe]を起動する際に “例外が発生する人の参考になれば幸いです。

スポンサーリンク

最後までご覧いただき、ありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です