0

MySQL データベースに接続するための C++ DLL を作成しています。特に、TCP (ポート 3306) 経由でリモート MySQL サーバーに接続できるように、Windows ファイアウォール リストに例外を追加しようとします。ポートを追加しようとすると、プログラムを管理者として実行しない限り、 HRESULTof が表示されます。E_ACCESSDENIED

ユーザーに管理者パスワードの入力を求めたいのですが、ポートがまだ例外リストにない場合に限ります。これは、私が知る限り、設定では常に管理者パスワードの入力が求められるため、単にUAC マニフェストを作成することはできないことを意味します。level="requireAdministrator"条件付きで管理者プロンプトを表示できますか?

4

3 に答える 3

3

ご要望に応じて、コメントから回答を作成しています。


これを行う正しい方法は、DLL のユーザーが状況を自分で処理できるようにすることです。API 開発者として、ファイアーウォールのようなものを気にするのは間違いなくあなたの仕事ではありません。他の人が言ったように、エンドユーザーが UAC 要求に応答できない理由はたくさんあります (例: ヘッドレス サーバー上) ため、対話型コンテキストで使用されている DLL に依存してはなりません。それは単にあなたの責任ではありません。


元のアイデアを本当に続けなければならない場合(これは、私見では悪い考えです) DLL を 2 つに分割することをお勧めします。

  • マニフェストなしの DLL 自体は、任意のユーザーの下で実行できます。
  • .exe必要な場合にのみ DLL によって実行される、管理者権限を必要とするマニフェストとは別のものです。

両方が同じディレクトリに格納されていることを要件にして、.dll を使用して DLL の (したがって.exeの) ディレクトリを簡単に見つけることができるようにしますGetModuleFileName

runas他の人はor (IMO と同様に有効な回答です) を指摘してRunDllいますが、私はどちらかというと Unix-y タイプなので、完全に別のバイナリを提案します。長期的に維持する方がはるかに簡単だと思います。


「中間」の解決策は、DLL がファイアウォールをまったく気にしないことですが (.exe必要に応じて)、ユーザーが必要なときにファイアウォールを正しくセットアップするのに役立つ完全に別のツール (マニフェストを使用) を提供します。これが最善の解決策かもしれません: クリーンな設計 (責任の分離) でありながら、必要なすべてのツールをユーザーに提供します。

于 2013-06-21T21:04:12.710 に答える
1

E_ACCESSDENIED が発生した場合はいつでも、「runas」動詞で ShellExecuteEx を使用してプログラムを再起動できます。このようなもの

        wchar_t szPath[MAX_PATH];
        if (GetModuleFileName(NULL, szPath, ARRAYSIZE(szPath)))
        {`enter code here`
            // Launch itself as administrator.
            SHELLEXECUTEINFO sei = { sizeof(sei) };
            sei.lpVerb = L"runas";
            sei.lpFile = szPath;
            sei.lpParameters=L"admin";
            sei.nShow = SW_NORMAL;

            if (!ShellExecuteEx(&sei))
            {
                DWORD dwError = GetLastError();
                if (dwError == ERROR_CANCELLED)
                {
                    ExitProcess(0);
                }
            }
            else
            {
                ExitProcess(0);
            }
        }
于 2013-06-21T19:53:28.293 に答える