什么是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. 走进HTTP协议之二 基本HTTP机制

    本系列第一节,我们回顾了与HTTP协议有关的基本术语和概念,本文将分析HTTP协议的基本原理与机制 HTTP协议的用途 HTTP协议用于客户端与服务器之间的通信,在通信线路两端,必定一端是客户端,另一 ...

  2. windows下搭建vue开发环境+IIS部署 [转]

    特别说明:下面任何命令都是在windows的命令行工具下进行输入,打开命令行工具的快捷方式如下图:     详细的安装步骤如下: 一.安装node.js 说明:安装node.js的windows版本后 ...

  3. mysql 在linux下的启动

    启动与停止 1.启动 MySQL安装完成后启动文件mysql在/etc/init.d目录下,在需要启动时运行下面命令即可. [root@test1 init.d]# /etc/init.d/mysql ...

  4. SpringRMI远程方法调用【原】

    Spring为各种远程访问技术的集成提供了工具类. 该小段引用自 http://www.open-open.com/lib/view/open1408957290478.html Spring远程支持 ...

  5. 夏令时(DST)测试

    夏令时测试是比较小众的测试,主要针对在有夏令时的国家使用的软件,如果你接触到了这方面的测试,说明你在挣国外的钱:).   话不多说,先来介绍下什么是夏令时:   夏时制,夏时令(Daylight Sa ...

  6. Javaweb学习笔记——(五)——————DOM&XML目录

    1.表单提交方式 *使用submit提交 <form> <input type="submit" /> </form> *使用button提交表 ...

  7. TwemProxy Redis架构

    TwemProxy 1.twemproxy是twitter开发的一个redis代理proxy. 通过Twemproxy可以使用多台服务器来水平扩张redis服务,可以有效的避免redis单点故障问题. ...

  8. Nginx 内核优化

    内核参数的优化示例: /etc/sysctl.conf net.ipv4.tcp_max_tw_buckets = // timewait的数量,默认是180000. net.ipv4.ip_loca ...

  9. string字符串js操作

    String 对象方法 方法 描述 anchor() 创建 HTML 锚. big() 用大号字体显示字符串. blink() 显示闪动字符串. bold() 使用粗体显示字符串. charAt() ...

  10. luogu P1641 [SCOI2010]生成字符串

    传送门 代码极短 \(O(n^2)\)dp是设\(f_{i,j,k}\)表示前\(i\)位,放了\(j\)个1,后面还可以接着放\(k\)个0的方案,转移的话,如果放0,\(k\)就要减1,反之放了1 ...