c# - 如何创建无需管理员权限即可部署的 Office COM 加载项

标签 c# office-interop office-addins excel-addins word-addins

我正在寻找一种开发 MS Office(Excel、Word、PowerPoint 等)插件的方法。该插件需要用 C# 或 C/C++ 编写,并且可部署,最终用户无需管理员权限即可安装它。

有一些工作示例,例如 Think-cellEikon 。但我不知道他们是如何存档的。

经过一番研究,我知道有以下几种创建加载项的方法,但没有一种不符合要求。

1。使用 Visual Studio Tools for Office (VSTO)

安装 VSTO 插件似乎不需要管理员权限,但需要安装 VSTO 运行时,并且运行时安装程序需要管理员权限。

2。实现IDTExenibility2接口(interface)

在这种情况下,DLL 可以放置在 C:\Users\myuser\AppData\等位置,无需管理员权限,但最终 DLL 必须是

  1. HKEY_CLASSES_ROOT 下注册为普通 COM,并且
  2. 已在 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\(PowerPoint|Excel|Word|Outlook|etc.)\Addins 下注册。

这里的问题是第一次注册需要管理员权限。

那么,是否有其他方法可以开发安装时不需要管理员权限的 Office 插件,例如 Think-Cell 和 Eikon?

注意:我可以使用 .NET,因为最新的 Windows 8/10 已预安装 .NET 运行时。但正如 Think-cell 和 Eikon 中所示,似乎不需要 .NET 来创建安装时不需要管理员权限的插件。

最佳答案

这是一个很好的问题,我需要自己回答。我的解决方案是一个小批处理脚本,它将文件复制到用户可访问的目录(在%appdata%目录下),然后将所有信息放入注册表中。请注意:使用 reg 命令,您无需管理员权限即可写入注册表(只要它位于 HKCU 中)。为了提供注册表项的正确路径,它会找到目标目录并将其放入注册表文件而不是占位符中。

所以,让我给您我的软件 SlideFab 中使用的代码,作为一种备份安装程序(如果没有可用的管理员权限)。该脚本可能不太漂亮并且没有错误处理,但它可以工作。

@echo off
echo ___________________________________________________________
echo Welcome to the SlideFab installer batch
echo ___________________________________________________________
echo This batch will install SlideFab 2 for the active user only
echo No system files will be touched
echo ___________________________________________________________
echo IMPORTANT: Do not run this install batch from the zip file
echo            directly. It won't work. Please extract the zip 
echo            file contents to a folder and run it from there.
echo   
echo For further information visit https://SlideFab.com
echo ___________________________________________________________
:Ask
echo Would you like install SlideFab 2?(Y/N)
set INPUT=
set /P INPUT=Type input: %=%
If /I "%INPUT%"=="y" goto yes 
If /I "%INPUT%"=="n" goto no 
goto Ask
:yes
set "sourcepath=%cd%"
set installfolder="SlideFab 2"
set installpath="%appdata%\SlideFab 2"

cd %appdata%
rmdir /S /Q %installfolder%
mkdir %installfolder%

cd %sourcepath%

robocopy "SlideFab 2" %installpath% /E

powershell "(Get-Content SlideFab.reg) | foreach-object {($_ -replace \"FOLDER_APP_DATA\", (\"%appdata%\").replace(\"\\\",\"\\\\\"))} | foreach-object {($_ -replace \"FILEPATH_APP_DATA\", (\"%appdata%\").replace(\"\\\",\"/\"))} | Set-Content SlideFabLocalized.reg"


reg import SlideFabLocalized.reg

del SlideFabLocalized.reg

echo SlideFab 2 was installed
pause
exit
:no
echo SlideFab 2 was not installed
pause

注册表项如下所示:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\PowerPoint\Addins\HuehnSolutions.SlideFab2]
"FriendlyName"="SlideFab2"
"Description"="SlideFab. The most powerful Powerpoint automation tool ever built"
"Manifest"="FOLDER_APP_DATA\\SlideFab 2\\SlideFab2.vsto|vstolocal"
"LoadBehavior"=dword:00000003


[HKEY_CURRENT_USER\Software\Microsoft\VSTO\Security\Inclusion\a6cf3786-79d9-47b1-a547-d4f03100b58d]
"Url"="file:///FILEPATH_APP_DATA/SlideFab 2/SlideFab2.vsto"
"PublicKey"="<RSAKeyValue><Modulus>seBB06Hh+Io1QcLLu2OVLl761vIeB4PDMAKlHDRlS9TVD0RZU4tBZ4ty22npfRhvt1Uqm5b8At7GZpQrLuMtX1AAvjmoy9qlm7NsX95UCFBP8ip//YvupVmcVpg7okAzuKALBu3anJGC1aa+Q57h6IP3cDnfdswoCvC1e9KJKpSmzktXG29MQ3nQBLn7Oo3UUM4C9Om8h/96cjowiI8FdHuz6JXIj8K8OEEhtCWxGnIL2ebYvnrPxBRFIlBHkuDeGHZ2C0hJB4MWN6MkTQEkJp5YtfJrt1oDmYPvlVjzp3gcUHcLft2/1gLnOVJFMDrwBM93YZNetQAuwzQdgxesHQ==</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>"

关于c# - 如何创建无需管理员权限即可部署的 Office COM 加载项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53633484/

相关文章:

c# - 如何打开Outlook新邮件窗口c#

c# - 滚动到 Microsoft Word 拆分窗口上的范围

visual-studio - Visual Studio 2019 中缺少 Javascript 控制台窗口

c# - 为什么即使我打开了 Excel 工作簿,Excel Application.Workbooks.Count 仍显示为零

c# - .NET 中的 Finalize 和 Dispose 方法有什么意义? (回答前详见)

c# - 可空列表 <> 作为输出参数

c# - 您可以在类型上而不是在类型的实例上拥有扩展方法吗?

c# - 筛选excel表格

excel - 我想替换 Excel 表中的特定列数据

c# - 如何将 Azure MSI AccessToken 添加到 EF6 DbContext 以连接 Azure SQL PaaS