请注意:
- 这些功能的文档没有提及任何特权要求;和
- 在有限的特权环境中,似乎没有人在使用这些功能时遇到问题;和
- 现在是 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
。在这一点上,文档变得更好了:
诸如RegOpenKeyEx
或RegQueryValueEx
允许您指定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\Classes
或HKEY_CURRENT_USER\Software\Classes
)。
所以如果它掉到HKCU
,你应该没问题。
警告实施者:不要依赖实施细节。