什么是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. [luogu2822][组合数问题]

    题目链接 题解: 对于上面和下面的式子进行分解质因数,然后看看上面的质因数个数减去下面的质因数个数能不能达到k的质因数的要求即可. 分解质因数的时候用对于阶乘分解质因数的常用方法:比如要求1999!中 ...

  2. MySQL的1067错误解决方法

    今天在学校的时候MySQL还运行的好好的,关机来公司后MySQL一直报错,错误为1067,网上找了好多办法,但是大都没效果,因此对这个错误做个总结: 打开你的安装目录下,查看my.ini文件中MySQ ...

  3. Telnet的三种登录方式

    Telnet的三种登录方式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.华为创建telnet的三种验证方式 首先,我们可以简单的看一个拓扑图,让我们可以在亦庄的路由器上对双桥 ...

  4. 8、JPA-映射-双向一对一

    一个管理对应一个部门,一个部门对应一个管理,例中由部门维护关联关系 实体类 Department package com.jpa.yingshe; import javax.persistence.* ...

  5. CM记录-升级Spark版本到2.x(转载)

    ①csd包:http://archive.cloudera.com/spark2/csd/    下载SPARK2_ON_YARN-2.2.0.cloudera1.jar ②parcel包:http: ...

  6. 机器学习课程-第8周-降维(Dimensionality Reduction)—主成分分析(PCA)

    1. 动机一:数据压缩 第二种类型的 无监督学习问题,称为 降维.有几个不同的的原因使你可能想要做降维.一是数据压缩,数据压缩不仅允许我们压缩数据,因而使用较少的计算机内存或磁盘空间,但它也让我们加快 ...

  7. css3让图文不能复制

    -webkit-user-select: none; -ms-user-select: none; -moz-user-select: none; -khtml-user-select: none; ...

  8. JS 互相调用iframe页面中js方法、VUE里 iframe 互调方法

    1,父 html 调用子 iframe 内方法: document.getElementById("iframe").contentWindow.func(data1,data2. ...

  9. [NOIP2012提高]借教室 题解(二分答案+差分)

    [NOIP2012提高&洛谷P1083]借教室 Description 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室 ...

  10. mysql案例 ~ 主从复制延迟处理(3)

    一 简介:今天咱们来汇总下如何避免主从延迟 二 方案: 1 集群硬件配置统一,磁盘组更好(SSD最佳),更大的内存 2 linux系统+mysql的配置参数已经优化 3 mysql从库没有任何慢语句进 ...