5

アプリケーション内の特定の機能を昇格させる方法があるかどうかを調べようとしています。たとえば、システム設定とユーザー設定がレジストリに保存されているアプリがあり、システム設定を変更する必要がある場合にのみ昇格が必要です。

残念ながら、私が遭遇したすべての情報は、昇格された特権で新しいプロセスを開始することだけについて語っています。

4

6 に答える 6

11

昇格レベルはプロセスごとの属性であるため、単一のプロセスの 1 つの関数または他の部分だけを昇格させることはできません。妊娠と同じように、あなたのプロセスは上昇するかどうかのどちらかです. コードの一部を管理者特権で実行する必要がある場合は、別のプロセスを開始する必要があります。

ただし、関数を COM オブジェクトとして実装できる場合は、次のように昇格した COM オブジェクトを作成することで、間接的に昇格して実行できます。

HRESULT 
CreateElevatedComObject (HWND hwnd, REFGUID guid, REFIID iid, void **ppv)
{
    WCHAR monikerName[1024];
    WCHAR clsid[1024];
    BIND_OPTS3 bo;

    StringFromGUID2 (guid, clsid, sizeof (clsid) / 2);

    swprintf_s (monikerName, sizeof (monikerName) / 2, L"Elevation:Administrator!new:%s", clsid);

    memset (&bo, 0, sizeof (bo));
    bo.cbStruct = sizeof (bo);
    bo.hwnd = hwnd;
    bo.dwClassContext = CLSCTX_LOCAL_SERVER;

    // Prevent the GUI from being half-rendered when the UAC prompt "freezes" it
    MSG paintMsg;
    int MsgCounter = 5000;  // Avoid endless processing of paint messages
    while (PeekMessage (&paintMsg, hwnd, 0, 0, PM_REMOVE | PM_QS_PAINT) != 0 && --MsgCounter > 0)
    {
        DispatchMessage (&paintMsg);
    }

    return CoGetObject (monikerName, &bo, iid, ppv);
}
于 2008-09-18T15:02:58.180 に答える
7

私が見た中で最高の記事はこれです:

http://www.codeproject.com/KB/vista-security/UAC__The_Definitive_Guide.aspx

既存の Microsoft アプリケーションが UAC プロンプトを表示しているときに、舞台裏で何が起こっているかの核心を説明し、自分でそれを行う方法を少し説明します。 ..

(彼が示す例はマネージ C++ であることに注意してください)

于 2008-09-17T00:57:36.613 に答える
3

Found a nice article that covers this here:

Most applications do not require administrator privileges at run time. If your application doesn't maintain cross-session state while it executes and doesn't do something like modifying the local security policy, it should be just fine running with a standard-user token. Sometimes certain parts of your application will require administrator privileges, and you should separate out those pieces into a separate process. I'll get into that a little later.

Looks like the article is talking about using C++, so I found another article that covers how to call this code using P/Invoke. So should be doable from .NET.

于 2008-09-17T00:47:24.923 に答える
3

Windows SDK "Cross Technology Samples" には "UACDemo" アプリケーションがあり、管理者プロセスを起動して昇格が必要なタスク (つまり への書き込み%programfiles%) を実行する C# Windows Forms アプリケーションの例を示します。

これは、独自の機能を作成するための優れた出発点です。このサンプルを拡張して、.Net Remoting と IPC を使用して、通常のユーザー プロセスと昇格されたプロセスの間で呼び出しを行うようにしました。これにより、昇格実行可能ファイルをジェネリックに保ち、アプリケーション内にアプリケーション固有のコードを実装できます。

于 2008-09-22T12:58:19.653 に答える
2

本当に必要なのは、設定を Application Data フォルダーに保存することです。

于 2008-09-17T00:41:53.237 に答える
0

Aydsman はここで正しい軌道に乗っていると思います。名前付きパイプのサポートが .NET 3.5 に追加されたことで、昇格された子プロセスと通信するための適切な IPC メカニズムが得られます。

于 2009-01-08T17:20:10.947 に答える