什么是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. 【CH5105】cookies 贪心+DP

    通过邻项交换法可知,怨气值大的孩子分得的饼干数也应该多(否则交换之后得到的解更优). 观察目标函数的性质,可知目标函数本身是由孩子饼干数的相对大小得到,因此此题中关注的是相对大小. 状态设计:\(dp ...

  2. .net视频教程代码之《提交注册内容》

    看我的视频之后感觉代码太多不好打或者容易打错的话可以来看我的这里的代码.我的视频地址是 https://www.bilibili.com/video/av12727717/ 类里面的代码: using ...

  3. MapReduce与关系型数据库的不同之处。

    MapReduce能够被视为RDBMS(关系型数据库)的补充. 1.MapReduce适合处理那些需要分析整个数据集的问题(日志分析等),以批处理的方式.RDBMS适合做点查询和更新. 2.MapRe ...

  4. Java编程思想 学习笔记1

    一.对象导论 1.抽象过程 Alan Kay曾经总结了第一个成功的面向对象语言.同时也是Java所基于的语言之一的Smalltalk的五个基本特性,这些特性表现了纯粹的面向对象程序设计方式 1)万物皆 ...

  5. xml总结(一 )

    一.了解 XML(eXtensive Markup Language)可扩展标记语言. XML是被用来传输和存储数据,焦点是内容,是对html的补充. HTML是将数据进行格式化显示.xml需要自定义 ...

  6. Oracle语句优先级

    SQL> SELECT SAL SALARY FROM EMP WHERE SALARY<2500;Warning: connection was lost and re-establis ...

  7. 三、编译第一步 make xxx_defconfig——Makefile.build 脚本

    3.1 上章分析回顾 3.1 上章分析出的参数 3.1.1 变量 MAKECMDGOALS = xxx_defconfig KBUILD_EXTMOD = version_h := include/g ...

  8. 第16月第6天 vs2005 lseek directdraw

    1. //_lseek(file_handle, -(int)pbitmap->bitmapinfoheader.biSizeImage, SEEK_END); SetFilePointer(( ...

  9. <video>标签:视频播放器动态设置src

    HTML代码 <div  id="my_div">    <video id="my_video"  width="600" ...

  10. sybench压测下模拟误truncate数据恢复

    基本环境:官方社区版MySQL 5.7.21 Row+Gtid开启sysbench压测,使用mysqldump备份数据库,执行truncate操作,恢复数据到truncate前的时间点1.切换日志,记 ...