什么是RMS:

Microsoft Windows Rights Management 服务 (RMS),是一种与应用程序协作来保护数字内容(不论其何去何从)的安全技术,专为那些需要保护敏感的 Web 内容、文档和电子邮件的用户而设计。用户可以严格规定哪些用户可以打开、读取、修改和重新分发特定内容。组织可以创建权限策略模板,以实施用户应用于内容的策略。

准备工作1:

下载并添加引用以下3个DLL:

Microsoft.Office.Interop.Excel.dll

Microsoft.Office.Interop.PowerPoint.dll

Microsoft.Office.Interop.Word.dll

并在dll的属性中,把“嵌入互操作类型”设为False

添加以下引用:

在添加引用-程序集-扩展中,引用office       ,(或引用Microsoft Office 14.0 Object Library)

在添加引用-程序集-框架中,引用PresentationCore和PresentationFramework

准备工作2:

打开word或者Excel等office文件,在信息-保护文档-限制访问-选择连接到权限管理服务器并获取模版,登陆域账号,后续在RMS加密工作将会使用这个域账号进行:
 

代码:

EncryptFile.cs

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using Microsoft.Office.Core;
  7. namespace WindowsFormsApplication1
  8. {
  9. class EncryptFile
  10. {
  11. /// <summary>
  12. /// 加密Word
  13. /// </summary>
  14. /// <param name="filemodel">文件属性</param>
  15. /// <param name="path">文件路径</param>
  16. /// <returns>加密结果</returns>
  17. public static bool EncryptWord(RMSFileModel filemodel, string path)
  18. {
  19. var wordClass = new Microsoft.Office.Interop.Word.ApplicationClass();
  20. Microsoft.Office.Interop.Word.Document mydoc = wordClass.Documents.Open(filemodel.FSourcePath);
  21. try
  22. {
  23. DateTime exprieDateTime = new DateTime(2027, 05, 19);
  24. if (mydoc != null)
  25. {
  26. mydoc.Activate();
  27. var irmPremission = mydoc.Permission;
  28. if (irmPremission.Enabled == true)
  29. {
  30. filemodel.FErrorMessage = "加密已加密的Word时错误";
  31. filemodel.FContent = "当前文档已经加密,操作失败!";
  32. return false;
  33. }
  34. mydoc.Application.Visible = false;
  35. irmPremission.Enabled = true;
  36. if (filemodel.Users != null && filemodel.Users.Length > 0)
  37. {
  38. foreach (var item in filemodel.Users)
  39. {
  40. if (!String.IsNullOrEmpty(ObjIsEmail(item)))
  41. {
  42. if (filemodel.FIsFullControl)
  43. {
  44. irmPremission.Add(item, MsoPermission.msoPermissionFullControl, exprieDateTime);
  45. }
  46. if (filemodel.FIsPrint)
  47. {
  48. irmPremission.Add(item, MsoPermission.msoPermissionPrint, exprieDateTime);
  49. }
  50. if (filemodel.FIsRead)
  51. {
  52. irmPremission.Add(item, MsoPermission.msoPermissionRead, exprieDateTime);
  53. }
  54. if (filemodel.FIsSave)
  55. {
  56. irmPremission.Add(item, MsoPermission.msoPermissionSave, exprieDateTime);
  57. }
  58. if (filemodel.FIsEdit)
  59. {
  60. irmPremission.Add(item, MsoPermission.msoPermissionEdit, exprieDateTime);
  61. }
  62. }
  63. }
  64. }
  65. else
  66. {
  67. irmPremission.Add("Everyone", MsoPermission.msoPermissionEdit, exprieDateTime);
  68. }
  69. }
  70. string tempPath = path + filemodel.FTitle;
  71. mydoc.SaveAs(tempPath);
  72. filemodel.FRMSPath = tempPath;
  73. filemodel.FContent = "加密成功";
  74. return true;
  75. }
  76. catch (Exception ex)
  77. {
  78. filemodel.FErrorMessage = "加密Word时错误";
  79. filemodel.FContent = ex.ToString();
  80. return false;
  81. }
  82. finally
  83. {
  84. mydoc.Close();
  85. wordClass.Quit();
  86. }
  87. }
  88. /// <summary>
  89. /// 加密Excel
  90. /// </summary>
  91. /// <param name="filemodel">文件属性</param>
  92. /// <param name="path">文件路径</param>
  93. /// <returns>加密结果</returns>
  94. public static bool EncryptExcel(RMSFileModel filemodel, string path)
  95. {
  96. var excelClass = new Microsoft.Office.Interop.Excel.ApplicationClass();
  97. var myExecl = excelClass.Workbooks.Open(filemodel.FSourcePath);
  98. try
  99. {
  100. DateTime exprieDateTime = new DateTime(2027, 05, 19);
  101. if (myExecl != null)
  102. {
  103. myExecl.Activate();
  104. var irmPremission = myExecl.Permission;
  105. if (irmPremission.Enabled == true)
  106. {
  107. filemodel.FErrorMessage = "加密已加密的Excel时错误";
  108. filemodel.FContent = "当前文档已经加密,操作失败!";
  109. return false;
  110. }
  111. myExecl.Application.Visible = false;
  112. irmPremission.Enabled = true;
  113. if (filemodel.Users != null && filemodel.Users.Length > 0)
  114. {
  115. foreach (var item in filemodel.Users)
  116. {
  117. if (!String.IsNullOrEmpty(ObjIsEmail(item)))
  118. {
  119. if (filemodel.FIsFullControl)
  120. {
  121. irmPremission.Add(item, MsoPermission.msoPermissionFullControl, exprieDateTime);
  122. }
  123. if (filemodel.FIsPrint)
  124. {
  125. irmPremission.Add(item, MsoPermission.msoPermissionPrint, exprieDateTime);
  126. }
  127. if (filemodel.FIsRead)
  128. {
  129. irmPremission.Add(item, MsoPermission.msoPermissionRead, exprieDateTime);
  130. }
  131. if (filemodel.FIsSave)
  132. {
  133. irmPremission.Add(item, MsoPermission.msoPermissionSave, exprieDateTime);
  134. }
  135. if (filemodel.FIsEdit)
  136. {
  137. irmPremission.Add(item, MsoPermission.msoPermissionEdit, exprieDateTime);
  138. }
  139. }
  140. }
  141. }
  142. else
  143. {
  144. irmPremission.Add("Everyone", MsoPermission.msoPermissionEdit, exprieDateTime);
  145. }
  146. }
  147. string tempPath = path + filemodel.FTitle;
  148. myExecl.SaveAs(tempPath);
  149. filemodel.FRMSPath = tempPath;
  150. filemodel.FContent = "加密成功";
  151. return true;
  152. }
  153. catch (Exception ex)
  154. {
  155. filemodel.FErrorMessage = "加密Excel时错误";
  156. filemodel.FContent = ex.ToString();
  157. return false;
  158. }
  159. finally
  160. {
  161. myExecl.Close();
  162. excelClass.Quit();
  163. }
  164. }
  165. /// <summary>
  166. /// 加密PPT
  167. /// </summary>
  168. /// <param name="filemodel">文件属性</param>
  169. /// <param name="path">文件路径</param>
  170. /// <returns>加密结果</returns>
  171. public static bool EncryptPPT(RMSFileModel filemodel, string path)
  172. {
  173. var pptClass = new Microsoft.Office.Interop.PowerPoint.ApplicationClass();
  174. var myppt = pptClass.Presentations.Open(filemodel.FSourcePath, MsoTriState.msoCTrue, MsoTriState.msoCTrue, MsoTriState.msoFalse);
  175. try
  176. {
  177. DateTime exprieDateTime = new DateTime(2027, 05, 19);
  178. if (myppt != null)
  179. {
  180. //myppt.Activate();
  181. var irmPremission = myppt.Permission;
  182. if (irmPremission.Enabled == true)
  183. {
  184. filemodel.FErrorMessage = "加密已加密的Excel时错误";
  185. filemodel.FContent = "当前文档已经加密,操作失败!";
  186. return false;
  187. }
  188. //myppt.Application.Visible = false;
  189. irmPremission.Enabled = true;
  190. if (filemodel.Users != null && filemodel.Users.Length > 0)
  191. {
  192. foreach (var item in filemodel.Users)
  193. {
  194. if (!String.IsNullOrEmpty(ObjIsEmail(item)))
  195. {
  196. if (filemodel.FIsFullControl)
  197. {
  198. irmPremission.Add(item, MsoPermission.msoPermissionFullControl, exprieDateTime);
  199. }
  200. if (filemodel.FIsPrint)
  201. {
  202. irmPremission.Add(item, MsoPermission.msoPermissionPrint, exprieDateTime);
  203. }
  204. if (filemodel.FIsRead)
  205. {
  206. irmPremission.Add(item, MsoPermission.msoPermissionRead, exprieDateTime);
  207. }
  208. if (filemodel.FIsSave)
  209. {
  210. irmPremission.Add(item, MsoPermission.msoPermissionSave, exprieDateTime);
  211. }
  212. if (filemodel.FIsEdit)
  213. {
  214. irmPremission.Add(item, MsoPermission.msoPermissionEdit, exprieDateTime);
  215. }
  216. }
  217. }
  218. }
  219. else
  220. {
  221. irmPremission.Add("Everyone", MsoPermission.msoPermissionEdit, exprieDateTime);
  222. }
  223. }
  224. string tempPath = path + filemodel.FTitle;
  225. myppt.SaveAs(tempPath);
  226. filemodel.FRMSPath = tempPath;
  227. filemodel.FContent = "加密成功";
  228. return true;
  229. }
  230. catch (Exception ex)
  231. {
  232. filemodel.FErrorMessage = "加密PPT时错误";
  233. filemodel.FContent = ex.ToString();
  234. return false;
  235. }
  236. finally
  237. {
  238. myppt.Close();
  239. pptClass.Quit();
  240. }
  241. }
  242. /// <summary>
  243. /// 清理Office进程
  244. /// </summary>
  245. public static void KillOfficeProcess()
  246. {
  247. try
  248. {
  249. var proWord = System.Diagnostics.Process.GetProcessesByName("WinWord");
  250. foreach (var word in proWord)
  251. {
  252. word.Kill();
  253. }
  254. var proExcel = System.Diagnostics.Process.GetProcessesByName("Excel");
  255. foreach (var excel in proExcel)
  256. {
  257. excel.Kill();
  258. }
  259. var proPPT = System.Diagnostics.Process.GetProcessesByName("POWERPNT");
  260. foreach (var ppt in proPPT)
  261. {
  262. ppt.Kill();
  263. }
  264. }
  265. catch (Exception)
  266. {
  267. throw;
  268. }
  269. }
  270. /// <summary>
  271. /// Object判断并转为Email(String格式)
  272. /// </summary>
  273. /// <param name="o">Object</param>
  274. /// <returns>Email</returns>
  275. public static string ObjIsEmail(object o)
  276. {
  277. string email = ObjToStr(o);
  278. if (!String.IsNullOrEmpty(email))
  279. {
  280. if (email.IndexOf("@") > -1)
  281. {
  282. return email;
  283. }
  284. else
  285. {
  286. return "";
  287. }
  288. }
  289. else
  290. {
  291. return "";
  292. }
  293. }
  294. /// <summary>
  295. /// Object转String
  296. /// </summary>
  297. /// <param name="o">Object</param>
  298. /// <returns>String</returns>
  299. public static string ObjToStr(object o)
  300. {
  301. if (o == null)
  302. {
  303. return "";
  304. }
  305. else
  306. {
  307. return o.ToString();
  308. }
  309. }
  310. }
  311. }
 

RMSFileModel.cs

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace WindowsFormsApplication1
  7. {
  8. public class RMSFileModel
  9. {
  10. /// <summary>
  11. /// 文件ID
  12. /// </summary>
  13. public int FID { get; set; }
  14. /// <summary>
  15. /// 完全控制
  16. /// </summary>
  17. public bool FIsFullControl { get; set; }
  18. /// <summary>
  19. /// 只读
  20. /// </summary>
  21. public bool FIsRead { get; set; }
  22. /// <summary>
  23. /// 打印
  24. /// </summary>
  25. public bool FIsPrint { get; set; }
  26. /// <summary>
  27. /// 另存
  28. /// </summary>
  29. public bool FIsSave { get; set; }
  30. /// <summary>
  31. /// 编辑
  32. /// </summary>
  33. public bool FIsEdit { get; set; }
  34. /// <summary>
  35. /// 文件名
  36. /// </summary>
  37. public string FTitle { get; set; }
  38. /// <summary>
  39. /// 在线URL路径(源文件路径)
  40. /// </summary>
  41. public string FUrlSourcePath { get; set; }
  42. /// <summary>
  43. /// 在线URL路径(加密后的文件路径)
  44. /// </summary>
  45. public string FUrlRMSPath { get; set; }
  46. /// <summary>
  47. /// 应用到用户
  48. /// </summary>
  49. public string[] Users { get; set; }
  50. /// <summary>
  51. /// 加密状态
  52. /// </summary>
  53. public string FState { get; set; }
  54. /// <summary>
  55. /// 加密错误分类
  56. /// </summary>
  57. public string FErrorMessage { get; set; }
  58. /// <summary>
  59. /// 加密详情
  60. /// </summary>
  61. public string FContent { get; set; }
  62. /// <summary>
  63. /// 本地物理路径(源文件)
  64. /// </summary>
  65. public string FSourcePath { get; set; }
  66. /// <summary>
  67. /// 本地物理路径(加密后的文件)
  68. /// </summary>
  69. public string FRMSPath { get; set; }
  70. }
  71. }
 

调用:

 
  1. /// <summary>
  2. /// 执行加密操作
  3. /// </summary>
  4. /// <param name="fileModel">文件属性</param>
  5. /// <returns>加密结果</returns>
  6. private bool HandleRMS(RMSFileModel fileModel)
  7. {
  8. try
  9. {
  10. //确认路径及创建文件夹
  11. string path = System.Windows.Forms.Application.StartupPath + "\\App_Data\\RMSFile\\";
  12. if (!Directory.Exists(path))
  13. {
  14. Directory.CreateDirectory(path);
  15. }
  16. //清理Office进程
  17. EncryptFile.KillOfficeProcess();
  18. string extension = Path.GetExtension(fileModel.FSourcePath).ToLower();//获取扩展名
  19. if (extension.IndexOf("doc") > -1)
  20. {
  21. return Common.EncryptFile.EncryptWord(fileModel, path);
  22. }
  23. if (extension.IndexOf("xls") > -1)
  24. {
  25. return Common.EncryptFile.EncryptExcel(fileModel, path);
  26. }
  27. if (extension.IndexOf("ppt") > -1)
  28. {
  29. return Common.EncryptFile.EncryptPPT(fileModel, path);
  30. }
  31. fileModel.FErrorMessage = "格式错误";
  32. fileModel.FContent = "无法加密该格式的文件";
  33. return false;
  34. }
  35. catch (Exception ex)
  36. {
  37. fileModel.FErrorMessage = "获取文件扩展名错误";
  38. fileModel.FContent = ex.ToString();
  39. return false;
  40. }
  41. }
谢谢!

使用RMS API 自定义Office(Word、Excel、PPT)加密策略的更多相关文章

  1. Atitit.office word  excel  ppt pdf 的web在线预览方案与html转换方案 attilax 总结

    Atitit.office word  excel  ppt pdf 的web在线预览方案与html转换方案 attilax 总结 1. office word  excel pdf 的web预览要求 ...

  2. java 如何将 word,excel,ppt如何转pdf--jacob

    问题:java 如果将 word,excel,ppt如何转pdf 我个人的观点:windows server下用 jacob; linux server下 用openoffice.   PS:1.本文 ...

  3. 在线文档转换API word,excel,ppt等在线文件转pdf、png

    在线文档转换API提供word,excel,ppt等在线文件转pdf.png等,文档:https://www.juhe.cn/docs/api/id/259 接口地址:http://v.juhe.cn ...

  4. Java解析OFFICE(word,excel,powerpoint)以及PDF的实现方案及开发中的点滴分享

    Java解析OFFICE(word,excel,powerpoint)以及PDF的实现方案及开发中的点滴分享 在此,先分享下写此文前的经历与感受,我所有的感觉浓缩到一个字,那就是:"坑&qu ...

  5. PDF/WORD/EXCEL/PPT 文档在线阅读

    查资料看了2种解决方法: 1.通过办公软件dll转换,用flans去看 2.通过Aspose转换成pdf格式,在用js前台读pdf(我用的pdf.js) 今天我解决的就是WORD/EXCEL/PPT ...

  6. java 如何将 word,excel,ppt如何转pdf --openoffice (1)

    承上启下,可折叠 上一篇说的是:服务器是windows server时,用jacob将msoffice(指的是word,excel,ppt)转换成pdf. 若被部署项目的服务器是centOS等linu ...

  7. Office word excel电子表格在线编辑的实现方法

    Office xp之后的版本支持通过webdav协议(http的扩展)直接编辑服务器上的文件. IIS(6.0)支持webdav,这在IIS管理器的web服务扩展中可以看到.利用IIS作为webdav ...

  8. Aspose是一个很强大的控件,可以用来操作word,excel,ppt等文件

    Aspose是一个很强大的控件,可以用来操作word,excel,ppt等文件,用这个控件来导入.导出数据非常方便.其中Aspose.Cells就是用来操作Excel的,功能有很多.我所用的是最基本的 ...

  9. word/excel/ppt 2 PDF

    PHP 实现 word/excel/ppt 转换为 PDF 一般最常见的就是利用OpenOffice来转换,来看看实现的核心代码: class PDFConverter { private $com; ...

随机推荐

  1. (转)同一服务器部署多个tomcat时的端口号修改详情

    背景:在同一个服务器上部署工程,总会遇到tomcat端口占用的情况,所有有必要分清楚各个端口的作用,和需要更改的端口. 同一服务器部署多个tomcat时,存在端口号冲突的问题,所以需要修改tomcat ...

  2. Eclipse:构造函数不提示才发现

    用Eclipse快一年了,今天才发现,原来按下 Alt+? 就可以显示构造函数中的参数. 想一想这一年都不知道是怎么过的,遇到构造函数时,郁闷啊... 2007-11-01

  3. Zookeeper客户端Curator---Getting Started

    先说个小插曲,前几天有个网站转载我的文章没有署名作者,我有点不开心就给他们留言了,然后今天一看他们把文章删了.其实我的意思并不是你允许转载,我想表达的是我的付出需要被尊重.也不知道是谁的错~ ==== ...

  4. My thoughts after NOIP 2018(1)

    联赛就这样结束了. 感觉真是奇怪啊.以前看重的东西,像是忽然扔下的包袱,一下子轻了. 而我一直在逃避的,不愿直面的东西,果然终于还是要再次面对了啊. 文化课百废待兴,\(noip\)的最终结果依然未知 ...

  5. MyEclipse导入Maven项目以及Maven转化为Dynamic Web Module(转)

    MyEclipse导入Maven项目(这个博主写的比较详细)https://blog.csdn.net/w12345_ww/article/details/52094756 Maven转化为Dynam ...

  6. 《Linux就该这么学》第二期视频

    Linux就该这么学--第二期学习笔记... ------------- 你的未来取决于你现在点点滴滴的努力 需要用到的一些工具: Vm11激活码 ---------- root在Linux系统中相当 ...

  7. 第一模块:python基础语法

    Python基础[day01]:python介绍发展史(一) Python基础[day01]:Hello World程序(二) Python基础[day01]:表达式if ...else语句(三) P ...

  8. JS中的offsetWidth、offsetHeight、clientWidth、clientHeight等等的详细介绍

    javascript中offsetWidth.clientWidth.width.scrollWidth.clientX.screenX.offsetX.pageX 原文:https://www.cn ...

  9. Docker-03 docker 加速器--DaoCloud 1.0

    最近在研究Docker,关于安装和加速器配置没有找到很详细的文章(手把手或者无人值守),对于小白的我,吃了不少苦头.于是我要把我学习Docker的过程记录下来,前面已经写了两篇文章了: Docker- ...

  10. Tomcat8.5配置https启动报空指针错误

    tomcat8.5版本和tomcat8.0有了很大的区别,默认的server.xml中https的配置方式也有了变化: <Connector port="8443" prot ...