【问题标题】:Programmatically determine if an Excel workbook (.xls) has been digitally signed以编程方式确定 Excel 工作簿 (.xls) 是否已进行数字签名
【发布时间】:2014-11-11 15:42:14
【问题描述】:

我目前有一个管理程序(用 .NET 4.5 编写)打包 Excel 工作簿以供我们的客户下载。工作簿保存为 .XLS(要求)。我正在寻找一种以编程方式检查 Excel 工作簿是否已进行数字签名的方法(通过 Excel 2010 VBA 或 .NET 4.5 C#,最好是 C#)。

编辑:我对要求有误。我需要在房子的 VBA/宏端寻找数字签名。

例如: 打开一个 Excel 工作簿 点击开发者标签,点击“工具”,点击“数字签名”

【问题讨论】:

    标签: c# vba excel ms-office


    【解决方案1】:

    您可以使用 Microsoft Office 工具来完成。在程序集Microsoft.Office.Tools.Excel.v4.0.Utilities 中,您会发现WorkbookBase 类有一个Signatures 属性,该属性返回一个集合。 WorkbookBase 文档是here。特别是 Signatures 被定义为

    获取工作簿的数字签名集合

    由于它是一个集合,您可以对其进行迭代或使用Count 属性来确定存在多少数字签名。该集合是一个 SignatureSet,有关它的文档可以在此link 的文档中找到。计数定义为:

    返回一个整数,表示指定集合中的项目数。

    您可以使用常规的Microsoft.Office.Interop.Excel 程序集和普通的Workbook 类来确定VBA 代码 是否已通过VBASigned 对象上的VBASigned 属性进行签名。可以在here 找到有关该属性的信息。

    获取一个值,该值指示工作簿的 Visual Basic for Applications 项目是否已进行数字签名。

    假设您使用的是 C# 并且 Microsoft.Office.Interop.Excel 程序集已作为参考添加到您的 VS C# 项目中,那么这样的代码将打开您的工作簿并获取 VBASigned 布尔标志:

    using Excel = Microsoft.Office.Interop.Excel;
    
    [snip]
    Excel.Application exApp = new Excel.Application();
    Excel.Workbook exWbk = exApp.Workbooks.Open(@"c:\path\to\your\workbook.xls");
    Boolean signed = exWbk.VBASigned;
    
    exWbk.Close();
    // When finished make sure we release the Interop COM objects we used
    Marshal.ReleaseComObject(exWbk);
    Marshal.ReleaseComObject(exApp); 
    

    【讨论】:

    • 这是一个很棒的解释。不幸的是,我对要求不正确;我需要将签名应用于 VBA/宏端。我为这个错误道歉。
    • @Falconeer 我已经用检查 VBA 代码是否已签名的信息修改了答案
    猜你喜欢
    • 2012-01-29
    • 2011-03-01
    • 1970-01-01
    • 2019-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-14
    相关资源
    最近更新 更多