使用RMS API 自定义Office(Word、Excel、PPT)加密策略
什么是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
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using Microsoft.Office.Core;
- namespace WindowsFormsApplication1
- {
- class EncryptFile
- {
- /// <summary>
- /// 加密Word
- /// </summary>
- /// <param name="filemodel">文件属性</param>
- /// <param name="path">文件路径</param>
- /// <returns>加密结果</returns>
- public static bool EncryptWord(RMSFileModel filemodel, string path)
- {
- var wordClass = new Microsoft.Office.Interop.Word.ApplicationClass();
- Microsoft.Office.Interop.Word.Document mydoc = wordClass.Documents.Open(filemodel.FSourcePath);
- try
- {
- DateTime exprieDateTime = new DateTime(2027, 05, 19);
- if (mydoc != null)
- {
- mydoc.Activate();
- var irmPremission = mydoc.Permission;
- if (irmPremission.Enabled == true)
- {
- filemodel.FErrorMessage = "加密已加密的Word时错误";
- filemodel.FContent = "当前文档已经加密,操作失败!";
- return false;
- }
- mydoc.Application.Visible = false;
- irmPremission.Enabled = true;
- if (filemodel.Users != null && filemodel.Users.Length > 0)
- {
- foreach (var item in filemodel.Users)
- {
- if (!String.IsNullOrEmpty(ObjIsEmail(item)))
- {
- if (filemodel.FIsFullControl)
- {
- irmPremission.Add(item, MsoPermission.msoPermissionFullControl, exprieDateTime);
- }
- if (filemodel.FIsPrint)
- {
- irmPremission.Add(item, MsoPermission.msoPermissionPrint, exprieDateTime);
- }
- if (filemodel.FIsRead)
- {
- irmPremission.Add(item, MsoPermission.msoPermissionRead, exprieDateTime);
- }
- if (filemodel.FIsSave)
- {
- irmPremission.Add(item, MsoPermission.msoPermissionSave, exprieDateTime);
- }
- if (filemodel.FIsEdit)
- {
- irmPremission.Add(item, MsoPermission.msoPermissionEdit, exprieDateTime);
- }
- }
- }
- }
- else
- {
- irmPremission.Add("Everyone", MsoPermission.msoPermissionEdit, exprieDateTime);
- }
- }
- string tempPath = path + filemodel.FTitle;
- mydoc.SaveAs(tempPath);
- filemodel.FRMSPath = tempPath;
- filemodel.FContent = "加密成功";
- return true;
- }
- catch (Exception ex)
- {
- filemodel.FErrorMessage = "加密Word时错误";
- filemodel.FContent = ex.ToString();
- return false;
- }
- finally
- {
- mydoc.Close();
- wordClass.Quit();
- }
- }
- /// <summary>
- /// 加密Excel
- /// </summary>
- /// <param name="filemodel">文件属性</param>
- /// <param name="path">文件路径</param>
- /// <returns>加密结果</returns>
- public static bool EncryptExcel(RMSFileModel filemodel, string path)
- {
- var excelClass = new Microsoft.Office.Interop.Excel.ApplicationClass();
- var myExecl = excelClass.Workbooks.Open(filemodel.FSourcePath);
- try
- {
- DateTime exprieDateTime = new DateTime(2027, 05, 19);
- if (myExecl != null)
- {
- myExecl.Activate();
- var irmPremission = myExecl.Permission;
- if (irmPremission.Enabled == true)
- {
- filemodel.FErrorMessage = "加密已加密的Excel时错误";
- filemodel.FContent = "当前文档已经加密,操作失败!";
- return false;
- }
- myExecl.Application.Visible = false;
- irmPremission.Enabled = true;
- if (filemodel.Users != null && filemodel.Users.Length > 0)
- {
- foreach (var item in filemodel.Users)
- {
- if (!String.IsNullOrEmpty(ObjIsEmail(item)))
- {
- if (filemodel.FIsFullControl)
- {
- irmPremission.Add(item, MsoPermission.msoPermissionFullControl, exprieDateTime);
- }
- if (filemodel.FIsPrint)
- {
- irmPremission.Add(item, MsoPermission.msoPermissionPrint, exprieDateTime);
- }
- if (filemodel.FIsRead)
- {
- irmPremission.Add(item, MsoPermission.msoPermissionRead, exprieDateTime);
- }
- if (filemodel.FIsSave)
- {
- irmPremission.Add(item, MsoPermission.msoPermissionSave, exprieDateTime);
- }
- if (filemodel.FIsEdit)
- {
- irmPremission.Add(item, MsoPermission.msoPermissionEdit, exprieDateTime);
- }
- }
- }
- }
- else
- {
- irmPremission.Add("Everyone", MsoPermission.msoPermissionEdit, exprieDateTime);
- }
- }
- string tempPath = path + filemodel.FTitle;
- myExecl.SaveAs(tempPath);
- filemodel.FRMSPath = tempPath;
- filemodel.FContent = "加密成功";
- return true;
- }
- catch (Exception ex)
- {
- filemodel.FErrorMessage = "加密Excel时错误";
- filemodel.FContent = ex.ToString();
- return false;
- }
- finally
- {
- myExecl.Close();
- excelClass.Quit();
- }
- }
- /// <summary>
- /// 加密PPT
- /// </summary>
- /// <param name="filemodel">文件属性</param>
- /// <param name="path">文件路径</param>
- /// <returns>加密结果</returns>
- public static bool EncryptPPT(RMSFileModel filemodel, string path)
- {
- var pptClass = new Microsoft.Office.Interop.PowerPoint.ApplicationClass();
- var myppt = pptClass.Presentations.Open(filemodel.FSourcePath, MsoTriState.msoCTrue, MsoTriState.msoCTrue, MsoTriState.msoFalse);
- try
- {
- DateTime exprieDateTime = new DateTime(2027, 05, 19);
- if (myppt != null)
- {
- //myppt.Activate();
- var irmPremission = myppt.Permission;
- if (irmPremission.Enabled == true)
- {
- filemodel.FErrorMessage = "加密已加密的Excel时错误";
- filemodel.FContent = "当前文档已经加密,操作失败!";
- return false;
- }
- //myppt.Application.Visible = false;
- irmPremission.Enabled = true;
- if (filemodel.Users != null && filemodel.Users.Length > 0)
- {
- foreach (var item in filemodel.Users)
- {
- if (!String.IsNullOrEmpty(ObjIsEmail(item)))
- {
- if (filemodel.FIsFullControl)
- {
- irmPremission.Add(item, MsoPermission.msoPermissionFullControl, exprieDateTime);
- }
- if (filemodel.FIsPrint)
- {
- irmPremission.Add(item, MsoPermission.msoPermissionPrint, exprieDateTime);
- }
- if (filemodel.FIsRead)
- {
- irmPremission.Add(item, MsoPermission.msoPermissionRead, exprieDateTime);
- }
- if (filemodel.FIsSave)
- {
- irmPremission.Add(item, MsoPermission.msoPermissionSave, exprieDateTime);
- }
- if (filemodel.FIsEdit)
- {
- irmPremission.Add(item, MsoPermission.msoPermissionEdit, exprieDateTime);
- }
- }
- }
- }
- else
- {
- irmPremission.Add("Everyone", MsoPermission.msoPermissionEdit, exprieDateTime);
- }
- }
- string tempPath = path + filemodel.FTitle;
- myppt.SaveAs(tempPath);
- filemodel.FRMSPath = tempPath;
- filemodel.FContent = "加密成功";
- return true;
- }
- catch (Exception ex)
- {
- filemodel.FErrorMessage = "加密PPT时错误";
- filemodel.FContent = ex.ToString();
- return false;
- }
- finally
- {
- myppt.Close();
- pptClass.Quit();
- }
- }
- /// <summary>
- /// 清理Office进程
- /// </summary>
- public static void KillOfficeProcess()
- {
- try
- {
- var proWord = System.Diagnostics.Process.GetProcessesByName("WinWord");
- foreach (var word in proWord)
- {
- word.Kill();
- }
- var proExcel = System.Diagnostics.Process.GetProcessesByName("Excel");
- foreach (var excel in proExcel)
- {
- excel.Kill();
- }
- var proPPT = System.Diagnostics.Process.GetProcessesByName("POWERPNT");
- foreach (var ppt in proPPT)
- {
- ppt.Kill();
- }
- }
- catch (Exception)
- {
- throw;
- }
- }
- /// <summary>
- /// Object判断并转为Email(String格式)
- /// </summary>
- /// <param name="o">Object</param>
- /// <returns>Email</returns>
- public static string ObjIsEmail(object o)
- {
- string email = ObjToStr(o);
- if (!String.IsNullOrEmpty(email))
- {
- if (email.IndexOf("@") > -1)
- {
- return email;
- }
- else
- {
- return "";
- }
- }
- else
- {
- return "";
- }
- }
- /// <summary>
- /// Object转String
- /// </summary>
- /// <param name="o">Object</param>
- /// <returns>String</returns>
- public static string ObjToStr(object o)
- {
- if (o == null)
- {
- return "";
- }
- else
- {
- return o.ToString();
- }
- }
- }
- }
RMSFileModel.cs
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace WindowsFormsApplication1
- {
- public class RMSFileModel
- {
- /// <summary>
- /// 文件ID
- /// </summary>
- public int FID { get; set; }
- /// <summary>
- /// 完全控制
- /// </summary>
- public bool FIsFullControl { get; set; }
- /// <summary>
- /// 只读
- /// </summary>
- public bool FIsRead { get; set; }
- /// <summary>
- /// 打印
- /// </summary>
- public bool FIsPrint { get; set; }
- /// <summary>
- /// 另存
- /// </summary>
- public bool FIsSave { get; set; }
- /// <summary>
- /// 编辑
- /// </summary>
- public bool FIsEdit { get; set; }
- /// <summary>
- /// 文件名
- /// </summary>
- public string FTitle { get; set; }
- /// <summary>
- /// 在线URL路径(源文件路径)
- /// </summary>
- public string FUrlSourcePath { get; set; }
- /// <summary>
- /// 在线URL路径(加密后的文件路径)
- /// </summary>
- public string FUrlRMSPath { get; set; }
- /// <summary>
- /// 应用到用户
- /// </summary>
- public string[] Users { get; set; }
- /// <summary>
- /// 加密状态
- /// </summary>
- public string FState { get; set; }
- /// <summary>
- /// 加密错误分类
- /// </summary>
- public string FErrorMessage { get; set; }
- /// <summary>
- /// 加密详情
- /// </summary>
- public string FContent { get; set; }
- /// <summary>
- /// 本地物理路径(源文件)
- /// </summary>
- public string FSourcePath { get; set; }
- /// <summary>
- /// 本地物理路径(加密后的文件)
- /// </summary>
- public string FRMSPath { get; set; }
- }
- }
调用:
- /// <summary>
- /// 执行加密操作
- /// </summary>
- /// <param name="fileModel">文件属性</param>
- /// <returns>加密结果</returns>
- private bool HandleRMS(RMSFileModel fileModel)
- {
- try
- {
- //确认路径及创建文件夹
- string path = System.Windows.Forms.Application.StartupPath + "\\App_Data\\RMSFile\\";
- if (!Directory.Exists(path))
- {
- Directory.CreateDirectory(path);
- }
- //清理Office进程
- EncryptFile.KillOfficeProcess();
- string extension = Path.GetExtension(fileModel.FSourcePath).ToLower();//获取扩展名
- if (extension.IndexOf("doc") > -1)
- {
- return Common.EncryptFile.EncryptWord(fileModel, path);
- }
- if (extension.IndexOf("xls") > -1)
- {
- return Common.EncryptFile.EncryptExcel(fileModel, path);
- }
- if (extension.IndexOf("ppt") > -1)
- {
- return Common.EncryptFile.EncryptPPT(fileModel, path);
- }
- fileModel.FErrorMessage = "格式错误";
- fileModel.FContent = "无法加密该格式的文件";
- return false;
- }
- catch (Exception ex)
- {
- fileModel.FErrorMessage = "获取文件扩展名错误";
- fileModel.FContent = ex.ToString();
- return false;
- }
- }
谢谢!
使用RMS API 自定义Office(Word、Excel、PPT)加密策略的更多相关文章
- Atitit.office word excel ppt pdf 的web在线预览方案与html转换方案 attilax 总结
Atitit.office word excel ppt pdf 的web在线预览方案与html转换方案 attilax 总结 1. office word excel pdf 的web预览要求 ...
- java 如何将 word,excel,ppt如何转pdf--jacob
问题:java 如果将 word,excel,ppt如何转pdf 我个人的观点:windows server下用 jacob; linux server下 用openoffice. PS:1.本文 ...
- 在线文档转换API word,excel,ppt等在线文件转pdf、png
在线文档转换API提供word,excel,ppt等在线文件转pdf.png等,文档:https://www.juhe.cn/docs/api/id/259 接口地址:http://v.juhe.cn ...
- Java解析OFFICE(word,excel,powerpoint)以及PDF的实现方案及开发中的点滴分享
Java解析OFFICE(word,excel,powerpoint)以及PDF的实现方案及开发中的点滴分享 在此,先分享下写此文前的经历与感受,我所有的感觉浓缩到一个字,那就是:"坑&qu ...
- PDF/WORD/EXCEL/PPT 文档在线阅读
查资料看了2种解决方法: 1.通过办公软件dll转换,用flans去看 2.通过Aspose转换成pdf格式,在用js前台读pdf(我用的pdf.js) 今天我解决的就是WORD/EXCEL/PPT ...
- java 如何将 word,excel,ppt如何转pdf --openoffice (1)
承上启下,可折叠 上一篇说的是:服务器是windows server时,用jacob将msoffice(指的是word,excel,ppt)转换成pdf. 若被部署项目的服务器是centOS等linu ...
- Office word excel电子表格在线编辑的实现方法
Office xp之后的版本支持通过webdav协议(http的扩展)直接编辑服务器上的文件. IIS(6.0)支持webdav,这在IIS管理器的web服务扩展中可以看到.利用IIS作为webdav ...
- Aspose是一个很强大的控件,可以用来操作word,excel,ppt等文件
Aspose是一个很强大的控件,可以用来操作word,excel,ppt等文件,用这个控件来导入.导出数据非常方便.其中Aspose.Cells就是用来操作Excel的,功能有很多.我所用的是最基本的 ...
- word/excel/ppt 2 PDF
PHP 实现 word/excel/ppt 转换为 PDF 一般最常见的就是利用OpenOffice来转换,来看看实现的核心代码: class PDFConverter { private $com; ...
随机推荐
- 锋利的jQuery复制粘贴(一)
两者区别:$(document).ready();网页中多有dom结构绘制完毕后就执行, 可能dom元素关联的东西没用加载完.[若有多个弹框,均可以执行输出] window.onload 必须等待多有 ...
- 【更新】搭建 Zookeeper-3.4.11 集群
先准备好三台linux(虚拟机). 1. 先把Java环境配好.我CentOS-7-x86_64-DVD-1708 + jdk1.8.0_161 1.1 先把jdk上传到系统里面(我利用的Filezi ...
- [持续更新] 文章列表 Last Update: 8/21/2017
1.前端 HTML5快速学习二 Canvas@20141125 HTML5快速学习一@20141122 2.ASP.NET(MVC) MVC5+EF6 完整教程17--升级到EFCore2.0@201 ...
- 超级牛皮的oracle的分析函数over(Partition by...) 及开窗函数
over(Partition by...) 一个超级牛皮的ORACLE特有函数. 天天都用ORACLE,用了快2年了.最近才接触到这个功能强大而灵活的函数.真实惭愧啊! oracle的分析函数over ...
- H3C配置FTP服务器
H3C配置FTP服务器 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.FTP协议简介 1.FTP协议是互联网上广泛使用的文件传输协议 FTP文件传送协议(File Transf ...
- Python基础【day01】:python 2和3区别(四)
许多Python初学者都会问:我应该学习哪个版本的Python.对于这个问题,我的回答通常是“先选择一个最适合你的Python教程,教程中使用哪个版本的Python,你就用那个版本.等学得差不多了,再 ...
- JavaSE学习总结(五)——封装,继承,多态很简单
java面向对象的三大特性是:封装.继承与多态,是面向对象编程的核心. 一.封装 简单说封装就是将同一类事物的特性与功能包装在一起,对外暴露调用的接口. 封装:封装也称信息隐藏,是指利用抽象数据类型把 ...
- git协同开发
当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin. 要查看远程库的信息,用git remote: [root@w ...
- SQL语句(一)SQL和数据库数据表的创建
SQL的组成 (1) 数据定义语言DDL(Data Definition Language) 用于数据库和数据表的创建.修改和删除等操作 CREATE (create) 创建数据库.数据表 ALTER ...
- Jena搭建SPARQL查询RDF数据
1 Jena搭建SPARQL查询RDF数据 1.1 Jena概要 · SPARQL是W3C的RDF数据工作组设计的一种查询语言和协议,用于RDF数据的查询.经过类似于JDK安装时候的配置,可以在命令行 ...