在 UAC 管理下组件创建失败,无需 UAC 提升即可工作

发布于 2024-11-01 04:51:47 字数 895 浏览 1 评论 0原文

我有一个带有自定义注册过程的.NET COM dll,因此它在HKEY_CURRENT_USER\Software\Classes下注册,与HKEY_LOCAL_MACHINE相反。因此有以下键(当前用户是 Windows 7 PC 上的管理员):

HKEY_CURRENT_USER\Software\Classes\My.ProgId\CLSID
HKEY_CURRENT_USER\Software\Classes\CLSID\{XYZZYZYZYZ-YZYZY-ZYZYZY} etc

如果我构建一个简单的 C++ 客户端:

hr = CLSIDFromProgID(OLESTR("My.ProgId"), &clsid); 

并在没有 UAC 提升 (Windows 7) 的情况下运行它,它会成功创建组件。 另一方面,如果我在打开海拔的情况下运行,则会失败并显示 Invalid class string

我已经使用进程监视器进行了检查,当它工作时,它会查找 HKCU\Software\Classes\My.ProgID 键并且打开正常。当它失败(提升)时,它会查找 HKCR\My.ProgIdNAME NOT FOUND 错误。从 classes_root 手动打开注册表项是成功的:

HKEY key;
RegOpenKey( HKEY_CLASSES_ROOT, _T( "My.ProgId"), &key);

请帮忙!谢谢

I have a .NET COM dll with a custom registration procedure so it gets registered under HKEY_CURRENT_USER\Software\Classes as opposite to HKEY_LOCAL_MACHINE. So there are the following keys (current user is the admin on the Windows 7 PC):

HKEY_CURRENT_USER\Software\Classes\My.ProgId\CLSID
HKEY_CURRENT_USER\Software\Classes\CLSID\{XYZZYZYZYZ-YZYZY-ZYZYZY} etc

If I build a simple C++ client:

hr = CLSIDFromProgID(OLESTR("My.ProgId"), &clsid); 

and run it without UAC elevation (Windows 7), it creates the component successfully.
On the other hand, if I run with elevation on, it fails with Invalid class string.

I've inspected with process monitor, when it works it looks for the HKCU\Software\Classes\My.ProgID key and that opens ok. When it fails (elevation on) it looks for HKCR\My.ProgId and errors with NAME NOT FOUND. Opening the registry key manually from classes_root is successful though:

HKEY key;
RegOpenKey( HKEY_CLASSES_ROOT, _T( "My.ProgId"), &key);

Please help! Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文