一个需要授权的Excel add-in
在网上有朋友问我怎么阻止非授权用户使用add-in。在这里我给出一个例子(当然,在实际工作中使用的逻辑要远比这个复杂。这里只是说明一个大体的过程罢了)
首先我在app.config中设定了一个MD5值(就是我的授权码了,本例中是“This is a test!”)。
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="MySecurityStrng" type="System.Configuration.SingleTagSectionHandler"/> </configSections> <MySecurityStrng key="702EDCA0B2181C15D457EACAC39DE39B" /> <!-- Key: This is a test! --> </configuration>
然后再ThisAddIn中作如下修改:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml.Linq; using Excel = Microsoft.Office.Interop.Excel; using Office = Microsoft.Office.Core; using Microsoft.Office.Tools.Excel; using System.Configuration; using System.Windows.Forms; using System.Collections; using System.Security.Cryptography; using Microsoft.Win32; namespace ExcelAddIn7 { public partial class ThisAddIn { private void ThisAddIn_Startup(object sender, System.EventArgs e) { Configuration cnf = ConfigurationManager.OpenExeConfiguration( AppDomain.CurrentDomain.SetupInformation.ConfigurationFile .Replace(".config", "")); Hashtable ht = (Hashtable)ConfigurationManager .GetSection("MySecurityStrng"); Form1 frm = new Form1(); frm.ShowDialog(); string value = frm.Value; using (MD5 hash = MD5.Create()) { byte[] buffer = hash.ComputeHash(Encoding.UTF8.GetBytes(value)); StringBuilder sb = new StringBuilder(); for (int i = 0; i < buffer.Length; i++) { sb.Append(buffer[i].ToString("X2")); } if (!ht["key"].ToString().Equals(sb.ToString())) { RegistryKey rk = Registry.CurrentUser .OpenSubKey("Software\\Microsoft\\Office\\Excel\\" +"Addins\\ExcelAddIn7",true); if (rk != null) { rk.SetValue("LoadBehavior", 2); rk.Close(); } MessageBox.Show("You can't use this Add-in"); Application.Quit(); } } } private void ThisAddIn_Shutdown(object sender, System.EventArgs e) { } #region VSTO generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InternalStartup() { this.Startup += new System.EventHandler(ThisAddIn_Startup); this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown); } #endregion } }
征诛志异,三让两家王朝;功同开辟,一桮万古江南。