什么是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. MQTT——取消订阅报文和断开连接报文

    笔者已经把连接报文,订阅报文,发布报文都讲解了完了.而接下来就是取消订阅报文和断开连接报文.和其他的报文比较的话,他们显示非常简单.甚至笔者觉得可以不必要拿出来讲.只要看一下MQTT文档就没有什么不清 ...

  2. (转)在Eclipse中创建Maven多模块工程

    背景:以前只总结了怎么在命令行下创建maven的多模块项目,在eclipse下怎么创建不是很清楚.最近需要在git的资源库中上传多模块项目,方便后期的维护,所以将网上的资料进行整理. 原文链接:htt ...

  3. hdu 1756(判断点是否在多边形中)

    传送门 题解: 射线法判定点是否在多边形内部: AC代码: #include<iostream> #include<cstdio> #include<cmath> ...

  4. java代码示例(6-3)

    创建AdministratorTest.java /** * 需求分析:创建管理员对象 * @author chenyanlong * 日期:2017/10/15 */ package com.hp. ...

  5. CodeForces911D 逆序对

    http://codeforces.com/problemset/problem/911/D 题意 给你一个长度为N的序列,有M次操作.每次翻转[l,r]的区间,每次操作后询问序列逆序对个数的奇偶性 ...

  6. Elasticsearch5.5 多机集群配置和x-pack安装配置

    x-pack安装配置 https://www.elastic.co/guide/en/elasticsearch/reference/current/installing-xpack-es.html ...

  7. 1021. Deepest Root (25)

    A graph which is connected and acyclic can be considered a tree. The height of the tree depends on t ...

  8. 多播委托和匿名方法再加上Lambda表达式

    多播委托就是好几个方法全都委托给一个委托变量 代码: namespace 委托 { class Program { static void math1() { Console.WriteLine(&q ...

  9. 如何正确的覆盖equals和hashCode

    一.Object所有的非final方法 public boolean equals(Object obj) public native int hashCode() public String toS ...

  10. python---自定义字段验证

    各个字段类,含正则和验证方法 #字段类 class IPField: REGULAR = "^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4] ...