16

を呼び出して C++ で記述された COM オブジェクトを昇格させる方法 に関する記事を見つけましたCoCreateInstanceAsAdmin。しかし、私が見つけたり実行したりできなかったのは、.NET (c#) アプリケーションのコンポーネントを COM オブジェクトとして実装し、そのオブジェクトを呼び出して UAC 昇格が必要なタスクを実行する方法です。MSDN では、これを管理 COM オブジェクト モデルとして文書化しています。

アプリケーション(または別のアプリ)を管理者として起動し、別のプロセスでタスクを実行することが可能であり、非常に簡単であることを認識しています(たとえば、Daniel Moth からの投稿を参照してください。しかし、私が探しているのは方法です昇格されていない同じ .NET 実行可能ファイル内からすべてを実行する. そうすることで、もちろん新しいプロセスで COM オブジェクトが生成されますが、透過的なマーシャリングのおかげで、.NET COM オブジェクトの呼び出し元は (あまりにもかなり)それを認識しています。

API を使用して、C# プロジェクトから C# で記述された COM オブジェクトをインスタンス化する方法についてのアイデアはCoCreateInstanceAsAdmin非常に役立ちます。そのため、C# で COM オブジェクトを作成する方法を学びたいと思っています。COM オブジェクトは、COM 昇格 API を介して C# から呼び出すことができます。

昇格した COM オブジェクトが同じプロセスで実行されなくてもかまいません。アプリケーション全体を昇格させて起動する必要はありません。コードを実行するCOMオブジェクトを昇格させたいだけです。行に沿って何かを書くことができれば:

// in a dedicated assembly, marked with the following attributes:
[assembly: ComVisible (true)]
[assembly: Guid ("....")]

public class ElevatedClass
{
    public void X() { /* do something */ }
}

次に、メインアプリケーションを呼び出しElevatedClassを通じてインスタンス化しCoCreateInstanceAsAdminます。でも、もしかしたら夢を見ているだけかもしれません。

4

3 に答える 3

8

Windows Vista UAC デモ サンプル コードを見てください。

( UnsafeNativeMethods.CoGetObject メソッドのVista Bridgeサンプルも必要です)

これにより、COM オブジェクトを含む、いくつかの異なる昇格方法を示す C# コードが得られます。

(不完全なコード サンプル - 上記のファイルを入手してください)

[return: MarshalAs(UnmanagedType.Interface)]
static internal object LaunchElevatedCOMObject(Guid Clsid, Guid InterfaceID)
   {
   string CLSID = Clsid.ToString("B"); // B formatting directive: returns {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} 
   string monikerName = "Elevation:Administrator!new:" + CLSID;

   NativeMethods.BIND_OPTS3 bo = new NativeMethods.BIND_OPTS3();
   bo.cbStruct = (uint)Marshal.SizeOf(bo);
   bo.hwnd = IntPtr.Zero;
   bo.dwClassContext = (int)NativeMethods.CLSCTX.CLSCTX_ALL;

   object retVal = UnsafeNativeMethods.CoGetObject(monikerName, ref bo, InterfaceID);

   return (retVal);
}
于 2008-11-22T21:52:39.127 に答える
2

昇格の要素はプロセスです。したがって、私があなたの質問を正しく理解していて、プロセスで COM オブジェクトを昇格させる方法が必要な場合、答えはできないということです。CoCreateInstanceAsAdmin の要点は、プロセスで実行しないことです。

于 2008-09-24T15:00:13.417 に答える