管理者権限でアプリケーションを実行した際に、共有フォルダなどのネットワークパスへのアクセスができないという事象が発生した。ユーザー名を認識できないか、またはパスワードが間違っています。状態としては、エクスプローラー上でネットワークパスにアクセスし、認証を通してある。よってアプリケーションの実行者が、ログインしているWindowsアカウントなら問題なくアクセスできるはずだ。原因を探ってみることにした。一般的に.Netで管理者権限を要する場合、app.manifestを作成し、↓のようにrequestedExecutionLevel=requireAdministratorにして対応する。ノードを以下のいずれかで置換します。要素を指定すると、ファイルおよびレジストリの仮想化が無効にされます。</assembly>上記設定後、アプリケーションを実行すると、UAC(ユーザーアカウント制御)の画面が表示され、[はい]を選択すると管理者権限で実行される、という流れだ。UACで管理者権限昇格して実行したプロセスと、通常のプロセスでは異なるユーザーセッションとなり、通常のプロセスで接続しているネットワークのセッションが引き継がれないようだ。UACを無効にするレジストリの値を変更するWindowsAPI(WNetAddConnection)を使用する一応と書いたのは、最初の2つの方法は推奨できないからだ。UACを無効にすることは他人に提供する手段ではないし、レジストリの値を変更することは、他のアプリで本来食い止めたいケースを食い止められなくなる。それを実現するのが、3つ目の「WindowsAPI(WNetAddConnection)を使用する」方法だ。.Netでユーザー認証を行う仕組みは、標準では用意されておらず、WindowsAPIを呼んで認証を通すことになる。エクスプローラーでもお馴染みの↓の認証ウィンドウだ。サンプルソース実際に、WindowsAPIを使った認証サンプルを書いてみる。}}実行してみると、↓の認証ダイアログが表示さる。接続できるユーザー、パスワードを入力する。例外とならず、無事に共有フォルダのファイルにアクセスできた。注意点として、NetCancelConnectは実行した後、数十秒~数分接続できる状態が残るようだ。その間は認証ダイアログが表示されなかった。コメントをキャンセルメールアドレスが公開されることはありません。