好的,我们有一个在 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 必须打开
最佳答案
请注意:
- 这些函数的文档没有提及任何特权要求;和
- 网上似乎没有人在权限受限的环境中遇到这些功能的问题;和
- 现在是 2012 年,我想如果这些功能现在不能在 UAC 下工作,有人会注意到。
所以(没有其他建议)我会说它很管用。
尽管如此,我还是查看了 COleObjectFactory::RegisterAll()
和 COleObjectFactory::UpdateRegistryAll()
的实现。
RegisterAll
最终调用 RegisterAll
会在 olefact.cpp:135
中结束,其中调用了 CoRegisterClassObject
。 From 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
orRegQueryValueEx
allow you to specify theHKEY_CLASSES_ROOT
key. When you call these functions from a process running in the interactive user account, the system merges the default settings inHKEY_LOCAL_MACHINE\Software\Classes
with the interactive user's settings atHKEY_CURRENT_USER\Software\Classes
.
进一步:
If you write keys to a key under
HKEY_CLASSES_ROOT
, the system stores the information underHKEY_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
orHKEY_CURRENT_USER\Software\Classes
).
因此,如果它落入 HKCU
,您应该没问题。
警告实现者:不要依赖实现细节。
关于c++ - Windows 7 中的 COleTemplateServer::RegisterAll() 会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11049665/