在网上有朋友问我怎么阻止非授权用户使用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
}
}