質問

私はaを開発しています com surrogate Cのオブジェクトは、私のアプリケーションで使用され、管理権を必要とする特定のアクションについてUAC標高ダイアログを呼び出します。

計画は、これをエクスポートすることで、さまざまな数の引数を持つ関数へのポインターを取り、別のコンテキストで実行する関数です。このようにして、アプリケーションはこのオブジェクトを使用して管理者権を使用していくつかのアクションを実行できます。必要なのは、そのオブジェクトを使用して、その権利とともに実行する必要がある関数へのポインターを渡すことだけです。

これは部分的に機能し、呼び出します CocreateinStance うまくいき、関数ポインターが渡され、私の関数が実行されます。ただし、このオブジェクトのインスタンスを使用して作成するとき Cocreateinstanceasadmin, 、問題が発生します。これがコードです:


HRESULT CoCreateInstanceAsAdmin(HWND hwnd, REFCLSID rclsid, REFIID riid, __out void ** ppv)
{
 // Manual implementation of CreateInstanceAsAdmin
 CComPtr BindCtx;
 HRESULT hr = CreateBindCtx(0,&BindCtx);
 BIND_OPTS3 bo;
 memset(&bo, 0, sizeof(bo));
 bo.cbStruct = sizeof(bo);
 bo.grfMode = STGM_READWRITE;
 bo.hwnd = hwnd;
 bo.dwClassContext = CLSCTX_LOCAL_SERVER;
 hr = BindCtx->SetBindOptions(&bo);
 if (SUCCEEDED(hr))
 {
  // Use the passed in CLSID to help create the COM elevation moniker string
  CComPtr Moniker;
  WCHAR wszCLSID[50];
  WCHAR wszMonikerName[300];
  StringFromGUID2(rclsid,wszCLSID,sizeof(wszCLSID) / sizeof(wszCLSID[0]));
  //Elevation:Administrator!new
  hr = StringCchPrintfW(wszMonikerName, sizeof(wszMonikerName)/sizeof(wszMonikerName[0]), L"Elevation:Administrator!new:%s", wszCLSID);
  if (SUCCEEDED(hr))
  {
   // Create the COM elevation moniker
   ULONG ulEaten = 0;
   ULONG ulLen = (ULONG)wcslen(wszMonikerName);
   LPBC pBindCtx = BindCtx.p;
   hr = MkParseDisplayName(pBindCtx,wszMonikerName,&ulEaten,&Moniker);
   if (SUCCEEDED(hr) && ulEaten == ulLen)
   {
    // Use passed in reference to IID to bind to the object
    IDispatch * pv = NULL;
    hr = Moniker->BindToObject(pBindCtx,NULL,riid,ppv);
   }
  }
 }
 return hr;
}

電話 Cocreateinstanceasadmin 「クラスが登録されていない」で失敗します。

オブジェクトは、次のレジストリキーを作成して登録されます(ここにREGファイルの本文があります)


[HKEY_CLASSES_ROOT\COMsurrogate]
@="COMsurrogate Class"

[HKEY_CLASSES_ROOT\COMsurrogate\CurVer]
@="COMsurrogate.1"

[HKEY_CLASSES_ROOT\COMsurrogate\CLSID]
@="{686B6F70-06AE-4dfd-8C26-4564684D9F9F}"

[HKEY_CLASSES_ROOT\CLSID\{686B6F70-06AE-4dfd-8C26-4564684D9F9F}]
@="COMsurrogate Class"
"LocalizedString"="@C:\\Windows\\system32\\COMsurrogate.dll,-101"
"DllSurrogate"=""

[HKEY_CLASSES_ROOT\CLSID\{686B6F70-06AE-4dfd-8C26-4564684D9F9F}\ProgID]
@="COMsurrogate.1"

[HKEY_CLASSES_ROOT\CLSID\{686B6F70-06AE-4dfd-8C26-4564684D9F9F}\VersionIndependentProgID]
@="COMsurrogate"

[HKEY_CLASSES_ROOT\CLSID\{686B6F70-06AE-4dfd-8C26-4564684D9F9F}\InprocServer32]
@="@C:\\windows\system32\COMsurrogate.dll"
"ThreadingModel"="Apartment"

[HKEY_CLASSES_ROOT\CLSID\{686B6F70-06AE-4dfd-8C26-4564684D9F9F}\NotInsertable]

[HKEY_CLASSES_ROOT\CLSID\{686B6F70-06AE-4dfd-8C26-4564684D9F9F}\Programmable]

いくつかのレジストリエントリが欠落していると思います。これは、エラーメッセージを読むときに到達する結論です。ただし、このレジストリキーのリストは、MSDNおよび他のサイトのドキュメントを調査した後にコンパイルされました。そのため、何も見逃していないことは確かです。

私がこれを解決しようとしたことの中には、ATLを介してそれを実装することがあります(登録が自動化されるように)。それはうまくいきますが、問題は、MIDL生成された関数プロトタイプにFuntionポインターを渡すことができないことです。

私はそれを使用してそれを渡そうとしました 変異体 タイプ:


 v.vt = VT_PTR;
 void (*myptr)(void);
 myptr = &DoTheStuff;
 v.byref = myptr;
 hr = theElevated->CoTaskExecuter(0, v);

その結果、「無効な引数タイプ」を取得します。

誰かが主題に光を当てることができますか?おそらく私が達成しようとしていることは、設計によって不可能ですか?

正しい解決策はありません

他のヒント

あなたが抱えている問題は設計によるものであり、ウィンドウのセキュリティの改善の意図は、潜在的なセキュリティリスクを回避するのに役立つと信じています。

マイクロソフトは、あなたがそうすることを止めることができれば、あなたがあなたの特権を高めることを本当に望んでいません。任意の機能を特権ユーザーとして実行すると、Windowsが適切に保護されたシステムでさえも簡単ではないはずです。トークンを使用して別のユーザーになりすまして、そのようにアクセスすることを改善することを試みることができますが、それでもそれはストレッチになるでしょう。私が正しく覚えていれば、ユーザーのなりすましはあなたが完全にアクセスできることを保証することさえしません。この場合の最良の解決策は、スーパーユーザーアカウントを使用して、正しい特権を適切に要求することです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top