none
管理者権限で実行すると Drag&Drop が効かない RRS feed

  • 質問

  • お世話になっております。北窓舎の芦田と申します。

    いくつかのソフトを開発しています(Visual Studio, VB.NET での Windows Forms application)。
    D&D機能を持たせているものがあります。
    通常起動(管理者権限ではない)するとD&D は期待どおり動作するのですが、管理者として起動すると Drag&Drop が効きません。

    実際には起動時に通常起動/管理者として起動を選択しているわけではなく、app.manifest ファイルに次の記述をしています。

      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
        <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
      </requestedPrivileges>


    の記述では D&D が効きません
    の記述では D&D が期待どおりに動作します

      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
        <requestedExecutionLevel  level="asInvoker" uiAccess="false" />
      </requestedPrivileges>. 


    作りたいのは、管理者権限で動作し、かつ D&D が効く Windows Forms アプリです。

    どのようにすれば良いのか、ご教示くださるようお願いいたします

    # なお、同じ趣旨の質問を MSDN (en-US) フォーラムに投稿しています。
      できれば、日本語で教えていただきたくて本フォーラム(ja-JP)にマルチポストしました。
      ご了承くださるようお願いいたします。



    2017年3月28日 0:37

回答

  • 既に再検討される旨を発言されていますので、以下は参考情報としてご確認ください。

    先に紹介したページにはWindows リソース保護 (WRP)も含まれています。Program Files以下への書き込みが制限されているのも同様にセキュリティ機能であり、アプリケーションが頻繁に書き込むべきではありません。

    ファイルを格納するディレクトリを別の場所に変更することを強くお勧めします。

    • 回答としてマーク Ashidacchi 2017年3月28日 4:09
    2017年3月28日 3:40

すべての返信

  • Windows Vostaから導入されたUACの一部、ユーザー インターフェイス特権の分離 (UIPI)による制限、つまりセキュリティ機能です。

    説明されているようにChangeWindowMessageFilter()にてこの制限を解除することもできますが、それよりは安易に管理者権限を要求すべきではないです。UACの主旨を理解しアプリケーションを設計されることをお勧めします。ともあれご判断は質問者さんにお任せします。

    • 回答の候補に設定 佐祐理 2017年3月28日 4:14
    2017年3月28日 1:00
  • こんにちは、Ashidacchi さん
    フォーラム オペレーターの立花楓です。

    US のフォーラムにも同一の内容のご投稿をいただいているようですね。
    複数のフォーラムでご質問いただくと情報が分散して共有できなくなってしまう可能性がありますので、
    恐れ入りますが、いずれかのスレッドへ絞って投稿いただけますようお願いいたします。

    今回は日本語での回答をご希望されているということですので、こちらのスレッドをご利用いただけますと幸いです。

    よろしくお願いいたします。


    MSDN/TechNet Community Support 立花楓

    2017年3月28日 1: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も必要なようですので追記しました。

    2017年3月28日 1:25
  • 佐祐理さん、早々にご回答いただき、ありがとうございます。

    アプリケーションを管理者権限で実行したい理由は、アプリケーションが C:\Program Files フォルダーなどにインストールされると、そのフォルダーにファイルを書き込むために管理者権限が要求されるためです。
    ファイル書き込み時にだけ管理者権限を取得すれば良いのでしょうが、その方法が分からないので、アプリケーション全体として管理者権限で実行したいと思った次第です。

    アプリケーションの設計を再検討してみます。
    取り急ぎ、お礼申し上げます。

    北窓舎:芦田

    2017年3月28日 2:49
  • 立花楓さん、コメント(ガイド)を書いていただき、ありがとうございます。

    US フォーラムにも同様の投稿をしたのは、より多くの(もしかして、より早い)回答が得られるのではないかと思ったからです。(言葉としては日本語回答のほうがウレシイのですが・・・)

    すでに US フォーラムで1件の回答が寄せられているので、そのスレッドは削除せず残しておこうと思います。
    悪しからずご了承くださるようお願いいたします。

    北窓舎:芦田
    2017年3月28日 2:57
  • kenjinote さん、早々にご回答いただき、ありがとうございます。

    佐祐理さんからのご回答に返信したとおり、アプリケーションの設計を見直してみます。
    管理者権限での実行もやむなしと判断した場合は、お教えいただいた方法を試してみます。

    ありがとうございました。
    北窓舎:芦田
    2017年3月28日 3:00
  • 既に再検討される旨を発言されていますので、以下は参考情報としてご確認ください。

    先に紹介したページにはWindows リソース保護 (WRP)も含まれています。Program Files以下への書き込みが制限されているのも同様にセキュリティ機能であり、アプリケーションが頻繁に書き込むべきではありません。

    ファイルを格納するディレクトリを別の場所に変更することを強くお勧めします。

    • 回答としてマーク Ashidacchi 2017年3月28日 4:09
    2017年3月28日 3:40
  • 佐祐理さん、ありがとうございました。

    発想を変えるべきでした。ファイルを別のディレクトリに保存すべきでした。

    # 以前に作ったアプリケーションのインストーラーを変えて、インストール先を(従来の固有のディレクトリではなく)C:\Program Files などを指定できるようにしたためでした。アプリケーションを修正すべきですね・・・

    お礼申し上げます。
    北窓舎:芦田

    2017年3月28日 4:13
  • Ashidacchi さま よろしく。

    佐祐理 さまも書かれていますが、 Program Files に書き込む理由は何でしょうか?。
    ユーザーに係わらず共通設定と言う意味合いなのでしょうか?。
    それとも、別の Program のものを弄るのでしょうか?。
    何れにしても、本来権限の無い一般ユーザーでも書き込ませるのでしょうか?。

    ルートではなくフォルダを用意してそこに書いたり、
    Users\Public に用意したり、
    必要なら、その基底フォルダの属性を Hidden にしたりして隠蔽の手もありますが。

    どうしても、管理者権限が必要なら、その部分を外部化(process.start)して、
    管理者の確認ダイアログに頼る手もあります。

    Program 全体に、それを付与するのは、なるべく、避けるべきと思います。
    2017年3月28日 4:13
  • ShiroYuki_Mot さん、
    コメントを頂戴し、ありがとうございました。

    今回の質問の発端・理由は次のようなことです。

    既存のアプリケーションのインストーラーを変更し、C:\Program Files などにもインストールできるようにしました。
    従来は、当方が指定した特定ディレクトリにしかインストールできなかったのですが、任意の場所にインストールできるようにしてほしいとの要望にお応えした結果です。

    が、アプリケーション側では自分のインストールフォルダーに履歴などのファイルを保存するようにしていました。
    その結果、インストール先が権限が必要なフォルダーになると、ファイル保存ができなくなりました。

    なので、アプリケーション自体を管理者権限で実行するようにしました。

    ですが、アプリケーションを手直しし、ファイルの保存先を変えれば済むことに気付かされた・・・ということです。
    2017年3月28日 5:30
  • Ashidacchi さま 拝見しました。

    なるほど。  その様な経緯があったのですね。
    至極、当たり前の文章を書き込んだ事をお許し下さい。
    2017年3月28日 5:45
  • ShiroYuki_Mot さん、
    わざわざコメントしてくださって、ありがとうございます。

    元はと言えば、私の説明不足に端を発していますので、お気になさらないでください。
    また、あらためて皆さまにお礼申し上げます。
    ありがとうございました。

    北窓舎:芦田

    2017年3月28日 9:00