トップ回答者
管理者権限で実行すると Drag&Drop が効かない

質問
-
お世話になっております。北窓舎の芦田と申します。
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
いくつかのソフトを開発しています(Visual Studio, VB.NET での Windows Forms application)。
D&D機能を持たせているものがあります。
通常起動(管理者権限ではない)するとD&D は期待どおり動作するのですが、管理者として起動すると Drag&Drop が効きません。
実際には起動時に通常起動/管理者として起動を選択しているわけではなく、app.manifest ファイルに次の記述をしています。
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
上の記述では D&D が効きません。
下の記述では D&D が期待どおりに動作します。
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
</requestedPrivileges>.
作りたいのは、管理者権限で動作し、かつ D&D が効く Windows Forms アプリです。
どのようにすれば良いのか、ご教示くださるようお願いいたします
# なお、同じ趣旨の質問を MSDN (en-US) フォーラムに投稿しています。
できれば、日本語で教えていただきたくて本フォーラム(ja-JP)にマルチポストしました。
ご了承くださるようお願いいたします。
- 編集済み Ashidacchi 2017年3月28日 0:48
回答
-
既に再検討される旨を発言されていますので、以下は参考情報としてご確認ください。
先に紹介したページにはWindows リソース保護 (WRP)も含まれています。Program Files以下への書き込みが制限されているのも同様にセキュリティ機能であり、アプリケーションが頻繁に書き込むべきではありません。
ファイルを格納するディレクトリを別の場所に変更することを強くお勧めします。
- 回答としてマーク Ashidacchi 2017年3月28日 4:09
すべての返信
-
Windows Vostaから導入されたUACの一部、ユーザー インターフェイス特権の分離 (UIPI)による制限、つまりセキュリティ機能です。
説明されているようにChangeWindowMessageFilter()にてこの制限を解除することもできますが、それよりは安易に管理者権限を要求すべきではないです。UACの主旨を理解しアプリケーションを設計されることをお勧めします。ともあれご判断は質問者さんにお任せします。
- 回答の候補に設定 佐祐理 2017年3月28日 4:14
-
-
佐祐理さんの投稿とかぶりますが、私のWindows 10 (x64) の環境では、
ChangeWindowMessageFilterEx(hWnd, WM_DROPFILES, MSGFLT_ALLOW, 0) ChangeWindowMessageFilterEx(hWnd, WM_COPYDATA, MSGFLT_ALLOW, 0) ChangeWindowMessageFilterEx(hWnd, WM_COPYGLOBALDATA, MSGFLT_ALLOW, 0)
※hWndはドラッグ&ドロップの対象ウィンドウハンドル
とすることで、管理者権限で立ち上げたウィンドウでもエクスプローラーからドラッグ&ドロップされたファイルのパスを受け取ることができました。
参考サイト: https://dotnet-snippets.de/snippet/drag-and-drop-als-administrator/10007
追伸:
WM_COPYGLOBALDATAだけを通すようにしていましたが、WM_DROPFILES, WM_COPYDATAも必要なようですので追記しました。- 編集済み kenjinoteMVP 2017年3月28日 2:59
-
既に再検討される旨を発言されていますので、以下は参考情報としてご確認ください。
先に紹介したページにはWindows リソース保護 (WRP)も含まれています。Program Files以下への書き込みが制限されているのも同様にセキュリティ機能であり、アプリケーションが頻繁に書き込むべきではありません。
ファイルを格納するディレクトリを別の場所に変更することを強くお勧めします。
- 回答としてマーク Ashidacchi 2017年3月28日 4:09
-
Ashidacchi さま よろしく。
佐祐理 さまも書かれていますが、 Program Files に書き込む理由は何でしょうか?。
ユーザーに係わらず共通設定と言う意味合いなのでしょうか?。
それとも、別の Program のものを弄るのでしょうか?。
何れにしても、本来権限の無い一般ユーザーでも書き込ませるのでしょうか?。
ルートではなくフォルダを用意してそこに書いたり、
Users\Public に用意したり、
必要なら、その基底フォルダの属性を Hidden にしたりして隠蔽の手もありますが。
どうしても、管理者権限が必要なら、その部分を外部化(process.start)して、
管理者の確認ダイアログに頼る手もあります。
Program 全体に、それを付与するのは、なるべく、避けるべきと思います。- 編集済み ShiroYuki_Mot 2017年3月28日 4:17 誤字訂正
-
ShiroYuki_Mot さん、
コメントを頂戴し、ありがとうございました。
今回の質問の発端・理由は次のようなことです。
既存のアプリケーションのインストーラーを変更し、C:\Program Files などにもインストールできるようにしました。
従来は、当方が指定した特定ディレクトリにしかインストールできなかったのですが、任意の場所にインストールできるようにしてほしいとの要望にお応えした結果です。
が、アプリケーション側では自分のインストールフォルダーに履歴などのファイルを保存するようにしていました。
その結果、インストール先が権限が必要なフォルダーになると、ファイル保存ができなくなりました。
なので、アプリケーション自体を管理者権限で実行するようにしました。
ですが、アプリケーションを手直しし、ファイルの保存先を変えれば済むことに気付かされた・・・ということです。