c++ - Windows 7 中的 COleTemplateServer::RegisterAll() 会发生什么

标签 c++ windows-7 registry uac elevated-privileges

好的,我们有一个在 Windows XP 中运行良好的 C++ 应用程序。 它在初始化中有如下代码

// Register all OLE server (factories) as running.  This enables the
//  OLE libraries to create objects from other applications.
COleObjectFactory::RegisterAll();

现在就像我说的,它在 Windows XP 中运行良好,但据我所知,该程序试图注册其 COM 接口(interface),这在 XP 中很好,但由于 UAC,这在 Windows Vista 和 Windows 7 中可能是个问题.特别是如果它以标准用户身份运行(没有提升的权限)。

如果我理解正确的话,这是程序正常运行所必需的,但如果没有提升的权限,它就无法执行这段代码。如果它会在每次应用程序运行时运行(这通常在 CWinApp::init() 运行时运行)

在你说只使用管理员权限之前,用户不会有它们,没有办法改变

那么,现在我的问题是:

1) 我的假设是否正确?

2) 如果我是正确的,最好的解决方法是什么?我可以删除这个吗?我需要设置其他东西吗? (我们更改了一些 VB 模块以使用 XML 文件而不是注册表中的内容

PS:模块编译成DLL

PPS:UAC 必须打开

最佳答案

请注意:

  1. 这些函数的文档没有提及任何特权要求;和
  2. 网上似乎没有人在权限受限的环境中遇到这些功能的问题;和
  3. 现在是 2012 年,我想如果这些功能现在不能在 UAC 下工作,有人会注意到。

所以(没有其他建议)我会说它很管用。

尽管如此,我还是查看了 COleObjectFactory::RegisterAll()COleObjectFactory::UpdateRegistryAll() 的实现。

RegisterAll

最终调用 RegisterAll 会在 olefact.cpp:135 中结束,其中调用了 CoRegisterClassObjectFrom MSDN :

Registers an EXE class object with OLE so other applications can connect to it.

我相信此注册将仅限于当前用户的 session 和应用程序的生命周期。 备注 部分涉及特权(从 Windows Server 2003 开始​​...)但未提供任何具体内容。

有一个对象称为运行对象表 (ROT),可以通过GetRunningObjectTable 检索到。 .文档有这个片段:

Each workstation has a local ROT that maintains a table of the objects that have been registered as running on that computer.

The COM Elevation Moniker有一些关于 ROT 和特权的更多信息(它表明各种特权级别的进程可以很好地工作)。左侧的链接也可能有帮助。

总体而言,似乎没有任何迹象表明 CoRegisterClassObject 需要管理员权限。

更新注册表

此函数在 olefact.cpp:375 中结束,它在其中打开 HKEY_CLASSES_ROOT。此时the documentation变得更好一点:

Registry functions such as RegOpenKeyEx or RegQueryValueEx allow you to specify the HKEY_CLASSES_ROOT key. When you call these functions from a process running in the interactive user account, the system merges the default settings in HKEY_LOCAL_MACHINE\Software\Classes with the interactive user's settings at HKEY_CURRENT_USER\Software\Classes.

进一步:

If you write keys to a key under HKEY_CLASSES_ROOT, the system stores the information under HKEY_LOCAL_MACHINE\Software\Classes

文档没有定义当您尝试在有限权限下写入 HKEY_CLASSES_ROOT 时会发生什么(即标准用户不能写入 HKLM),但我相信您最终会写信给 HKCU

最后,注意:

Windows Server 2003 and Windows XP/2000: Applications can register dependent COM objects to either the per-machine or per-user COM configuration store (HKEY_LOCAL_MACHINE\Software\Classes or HKEY_CURRENT_USER\Software\Classes).

因此,如果它落入 HKCU,您应该没问题。

警告实现者:不要依赖实现细节。

关于c++ - Windows 7 中的 COleTemplateServer::RegisterAll() 会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11049665/

相关文章:

windows - 安装Wix后,从“添加/删除程序”列表中删除程序

c++ - WinDbg 是如何认识源码的?

c++ - 多种类型的模板方法特化

c++ - 对象即时 VB Net 的 vector

Java 应用程序 tcp 连接丢失检测在 Windows 7 中有所不同?

windows - 使用 VBScript 检查注册表项是否存在

c++ - 在 OpenCV 中使用旋转和平移矩阵

windows-7 - 将 () 绑定(bind)到 Windows 7 中的 IPv6 地址失败,错误代码::WSAEADDRNOTAVAIL (10049)

c# - 恢复另一个应用程序的最小化窗口

java - 在新的 Windows 8 上读取和写入 Java 首选项失败,