c# - 以编程方式安装证书吊销列表 (CRL)

标签 c# powershell scripting vbscript batch-file

我需要每周一次下载并安装大约 50 个 CRL,并将它们安装在多个 Windows 服务器上。下载是简单的部分,有什么方法可以编写 CRL 导入过程的脚本吗?

最佳答案

这是我的最终来源(为公众略微删减)——但应该可以使用。我不会更改已接受的答案,但我确实希望这会有所帮助(就像对问题和答案进行投票一样!)。

注意:这会将 CRL 或常规证书导入本地机器受信任的根存储区。在 CertOpenStore 调用中将以下 CERT_SYSTEM_STORE_LOCAL_MACHINE 更改为 CERT_SYSTEM_STORE_CURRENT_USER 会将其更改为适用于当前用户存储。

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace ConsoleApplication2
{
  class Program
  {
    public struct CRYPTUI_WIZ_IMPORT_SRC_INFO
    {
      public Int32 dwSize;
      public Int32 dwSubjectChoice;
      [MarshalAs(UnmanagedType.LPWStr)]public String pwszFileName;
      public Int32 dwFlags;
      [MarshalAs(UnmanagedType.LPWStr)]public String pwszPassword;
    }

    [DllImport("CryptUI.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern Boolean CryptUIWizImport(
      Int32 dwFlags,
      IntPtr hwndParent,
      IntPtr pwszWizardTitle,
      ref CRYPTUI_WIZ_IMPORT_SRC_INFO pImportSrc,
      IntPtr hDestCertStore
    );

    [DllImport("CRYPT32.DLL", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern IntPtr CertOpenStore(
      int storeProvider,
      int encodingType,
      IntPtr hcryptProv,
      int flags,
      String pvPara
    );

    public const Int32 CRYPTUI_WIZ_IMPORT_SUBJECT_FILE = 1;
    public const Int32 CRYPT_EXPORTABLE = 0x00000001;
    public const Int32 CRYPT_USER_PROTECTED = 0x00000002;
    public const Int32 CRYPTUI_WIZ_NO_UI = 0x0001;

    private static int CERT_STORE_PROV_SYSTEM = 10;
    private static int CERT_SYSTEM_STORE_CURRENT_USER = (1 << 16);
    private static int CERT_SYSTEM_STORE_LOCAL_MACHINE = (2 << 16);

    static void Main(string[] args)
    {
      if (args.Length != 1)
      {
        Console.WriteLine("Usage: certimp.exe list.crl");
        Environment.ExitCode = 1;
      }
      else
      {
        IntPtr hLocalCertStore = CertOpenStore(
          CERT_STORE_PROV_SYSTEM,
          0,
          IntPtr.Zero,
          CERT_SYSTEM_STORE_LOCAL_MACHINE,
          "ROOT"
        );

        CRYPTUI_WIZ_IMPORT_SRC_INFO importSrc = new CRYPTUI_WIZ_IMPORT_SRC_INFO();
        importSrc.dwSize = Marshal.SizeOf(importSrc);
        importSrc.dwSubjectChoice = CRYPTUI_WIZ_IMPORT_SUBJECT_FILE;
        importSrc.pwszFileName = args[0];
        importSrc.pwszPassword = null;
        importSrc.dwFlags = CRYPT_EXPORTABLE | CRYPT_USER_PROTECTED;

        if (!CryptUIWizImport(
            CRYPTUI_WIZ_NO_UI,
            IntPtr.Zero,
            IntPtr.Zero,
            ref importSrc,
            hLocalCertStore
          ))
        {
          Console.WriteLine("CryptUIWizImport error " + Marshal.GetLastWin32Error());
          Environment.ExitCode = -1;
        }
      }
    }
  }
}

关于c# - 以编程方式安装证书吊销列表 (CRL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/878010/

相关文章:

c# - IoC 容器解决了 DbContext(EF) 导致实体中子对象的急切加载

.net - 将邮箱从 Exchange Server 导出到 PST 文件

Linux 正则表达式不能与 AWK 一起使用

scripting - tk, tcl 分别执行 stderr, stdout

c# - 如何将对象传递给计时器事件?

c# - Mysql c# 中选择查询的第二个结果

c# - 如何确定允许调用特定方法的对象类型?

powershell - 如何使用powershell在除了第一列和空单元格值之外的所有列中添加额外的 ';'(分号)或任何特殊字符

.net - 删除 Azure 上的特定 Application Insights 事件

linux - 根据时间启动和终止进程