Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Windows 7上创建高程COM对象失败_C_Com_Windows 7_Uac_Moniker - Fatal编程技术网

在Windows 7上创建高程COM对象失败

在Windows 7上创建高程COM对象失败,c,com,windows-7,uac,moniker,C,Com,Windows 7,Uac,Moniker,我正在用C开发一个COM代理对象,我的应用程序将使用它来调用UAC提升对话框,以执行某些需要管理权限的操作 计划是让它导出一个函数,该函数接受指向具有可变参数数的函数的指针,并在不同的上下文中执行。通过这种方式,应用程序可以使用这个对象来执行一些具有管理员权限的操作,他们所需要做的就是使用这个对象并向它传递一个指向必须使用所述权限执行的函数的指针 这可以部分工作,调用CoCreateInstance可以正常工作,传递函数指针并执行my函数 但是,当我使用和Microsoft的CoCreateIn

我正在用C开发一个COM代理对象,我的应用程序将使用它来调用UAC提升对话框,以执行某些需要管理权限的操作

计划是让它导出一个函数,该函数接受指向具有可变参数数的函数的指针,并在不同的上下文中执行。通过这种方式,应用程序可以使用这个对象来执行一些具有管理员权限的操作,他们所需要做的就是使用这个对象并向它传递一个指向必须使用所述权限执行的函数的指针

这可以部分工作,调用CoCreateInstance可以正常工作,传递函数指针并执行my函数

但是,当我使用和Microsoft的CoCreateInstanceAdmin示例代码创建此对象的实例时,会出现问题

代码如下:

HRESULT CoCreateInstanceAsAdmin(HWND hwnd, REFCLSID rclsid, REFIID riid, __out void ** ppv)
{
 // Manual implementation of CreateInstanceAsAdmin
 CComPtr<IBindCtx> 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<IMoniker> 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;
}
我想有些注册表项丢失了——这是我在阅读错误消息时得出的结论。然而,这份注册表项列表是在浏览了MSDN和其他网站上的文档之后编制的,所以我很确定没有遗漏任何内容

我试图解决的其中一个问题是通过ATL实现它(这样注册是自动化的)。这是可行的,但问题是我无法将函数指针传递给MIDL生成的函数原型

我尝试使用变量类型传递它:

结果我得到了“无效参数类型”


有人能解释一下这个问题吗?也许我试图通过设计实现的目标是不可能实现的?

我相信您遇到的问题是通过设计实现的,window的安全改进旨在帮助避免潜在的安全风险

如果微软能阻止你提升特权,它并不真的希望你提升特权。如果Windows是一个安全性很好的系统,那么作为特权用户执行任意函数在任何方面都不容易。您可以尝试使用令牌来模拟不同的用户,并通过这种方式获得更好的访问权限,但即使这样,这也是一种延伸。如果我没记错的话,用户模拟甚至不能保证您可以完全访问。在这种情况下,最好的解决方案就是使用超级用户帐户并正确地请求正确的权限。

真恶心。这应该作为一个单独的进程运行吗?这是否在64位版本的Windows上?x64 Win7上存在空白DllSurrogate问题。也没有AppID或代理/存根的迹象。裁判:恶心!这是一个巨大的安全漏洞。如果您需要使用提升的权限来执行代码,那么就给它指定要执行的固定函数。让它执行任意函数指针意味着您可能已经提升了原始程序!您不能向进程外COM对象传递有意义的指针,“进程外”位应该提示您进入该对象。在这种情况下,您最好使用一个预注册的对象来完成这项工作,然后跨边界封送它,但您最好首先提升该COM对象。至于错误,请仔细检查,它是在HKEY_LOCAL_机器(导航到Software\Classes\CLSID\…)而不是HKEY_CURRENT_用户中注册的。如果它在当前用户中,则提升用户无法看到它,因为他们在vista+中实现COM的方式。

[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]

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