2

好的,所以我们有一个在 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 接口,这在 XP 中很好,但这在 Windows Vista 和 Windows 7 中可能是一个问题,因为 UAC。特别是如果它作为标准用户运行(没有提升的特权)。

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

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

所以,现在我的问题是:

1)我的假设是否正确?

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

PS:模块编译成DLL

PPS:UAC 必须开启

4

1 回答 1

1

请注意:

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

所以(没有其他建议)我会说它只是有效。

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

RegisterAll

最终调用RegisterAll最终在olefact.cpp:135调用位置 CoRegisterClassObject来自 MSDN

向 OLE 注册一个 EXE 类对象,以便其他应用程序可以连接到它。

我相信这种注册将仅限于当前用户的会话和应用程序的生命周期。备注部分涉及特权(截至 Windows Server 2003...),但没有提供任何具体内容。

有一个称为Running Object Table(ROT) 的对象,可以通过GetRunningObjectTable. 文档有这个片段:

每个工作站都有一个本地 ROT,它维护一个已注册为在该计算机上运行的对象的表。

COM Elevation Moniker有更多关于 ROT 和权限的信息(它表明各种权限级别的进程都可以正常工作)。左侧的链接也可能有所帮助。

总的来说,似乎没有什么建议CoRegisterClassObject需要管理员权限。

UpdateRegistryAll

这个函数olefact.cpp:375在它打开的地方结束HKEY_CLASSES_ROOT。在这一点上,文档变得更好了:

诸如RegOpenKeyExRegQueryValueEx允许您指定HKEY_CLASSES_ROOT键的注册表功能。当您从交互式用户帐户中运行的进程调用这些函数时,系统会将默认设置HKEY_LOCAL_MACHINE\Software\Classes与交互式用户的设置合并在HKEY_CURRENT_USER\Software\Classes

进一步:

如果您将密钥写入下的密钥HKEY_CLASSES_ROOT,系统会将信息存储在下HKEY_LOCAL_MACHINE\Software\Classes

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

最后,请注意:

Windows Server 2003 和 Windows XP/2000:应用程序可以将依赖的 COM 对象注册到每台机器或每用户的 COM 配置存储(HKEY_LOCAL_MACHINE\Software\ClassesHKEY_CURRENT_USER\Software\Classes)。

所以如果它掉到HKCU,你应该没问题。

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

于 2012-06-18T11:35:37.200 回答