我是一个受限用户,我需要编写一个 Outlook 宏来公开 Outlook 2003 和 2007 中的 C# 库。
我根本没有任何管理员权限,甚至在安装时也没有,所以我无法运行 RegAsm,也无法(我假设)编写托管加载项。
在这种情况下,有什么方法可以从 VBA 调用 .Net 代码,还是有其他解决方案?
这仅供个人使用,所以一个丑陋的黑客是完全可以接受的(只要它有效)
我是一个受限用户,我需要编写一个 Outlook 宏来公开 Outlook 2003 和 2007 中的 C# 库。
我根本没有任何管理员权限,甚至在安装时也没有,所以我无法运行 RegAsm,也无法(我假设)编写托管加载项。
在这种情况下,有什么方法可以从 VBA 调用 .Net 代码,还是有其他解决方案?
这仅供个人使用,所以一个丑陋的黑客是完全可以接受的(只要它有效)
我通过运行regasm
该选项解决了这个问题,并在结果文件/regfile
中用 HKCU 替换了 HKLM 。.reg
有RegistrationServices.RegisterAssembly
.NET API(我相信它被 .NET API 使用RegAsm.exe
)。
还有RegOverridePredefKey
Win32 API,不起眼但非常有用,它允许重新映射HKEY_CLASSES_ROOT
(由 使用RegisterAssembly
)到HKEY_CURRENT_USER\Software\Classes
.
一个聪明的程序可以同时使用RegistrationServices.RegisterAssembly
和RegOverridePredefKey
在HKEY_CURRENT_USER
.
我自己没有尝试过,但我相信它是可行的。
更新,显然这种方法确实有效。
注册 COM 对象(例如 ActiveX 控件)并使其对系统中的所有用户可见需要管理权限。
但是,如果不需要对所有用户的可见性(或由于受限用户限制而不可能),则只能为特定用户注册 COM 对象。
这通常通过在 HKCU 而不是 HKLM 中注册对象来完成。这将适用于“常规”COM 对象和通过 .NET COM 互操作公开的对象。
其他更细粒度的方法也存在,已经提到的 RegFree COM 可以解决特定的可执行文件。
因此,鉴于上述所有情况,将所有信息捕获到 reg 文件中并用 HKCU 替换 HKLM 的解决方案应该可以工作(不是很好,但工具也是如此)。
我找到了一个可能的解决方案,但我还没有时间尝试。
不幸的是,由于 COM 的工作方式,没有管理员权限就不可能安装 COM 对象(互操作或其他)。
当您注册一个 com 对象时,它会写入几个条目,HKEY_CLASSES_ROOT
这些条目是机器级密钥,因此需要管理员权限。
现在,因为您确实说过可以接受骇人听闻的解决方案,所以您可以采取一些可能的步骤来使其正常工作;但是,如果您没有管理员权限,我假设这不是您的机器,很可能是工作机器。采取这些步骤很可能会让你被解雇。标准免责声明和诸如此类的东西:如果你是个白痴并让自己被起诉/解雇/枪杀/抢劫/等等,这不是我的错。
首先,您需要找出需要添加哪些注册表项。确保您在一台“干净”的机器上执行此操作,该机器以前没有见过您的组件(或者您知道没有 reg 键的主机)。安装机器监控程序以捕获密钥。 这是一个 [不相关] MS 文章的链接,他们在其中推荐了一些可以做到这一点的应用程序。
现在随着监视器运行安装您的插件。您现在应该能够获得需要创建哪些密钥的日志。使用您的日志创建注册表导出文件。
现在这里是棘手的地方。基本上,您要做的就是从 BartPE 映像启动机器并挂载注册表并运行您的脚本;但是,关键路径将不正确,因此脚本将无法“开箱即用”。
MS 有一篇 TechNet 文章(但链接中有括号,所以在这里效果不佳)所以谷歌它,它应该是第一个结果。
阅读完那篇文章后,您会看到机器注册表将作为HKEY_LOCAL_MACHINE
. 您需要做的是更改注册表导出以匹配新路径。完成此步骤后,您应该能够从 BartPE 映像启动,挂载注册表,然后导入脚本,卸载配置单元,然后重新启动。假设您将文件复制到正确的路径,那么它“应该”工作。
祝你好运。