如何以编程方式将 smime 证书添加到 outlook 联系人?

How to add smime certificate to outlook contacts programmatically?

我们目前正在开展一个项目,该项目需要向 Outlook 联系人添加 S/MIME 证书。目前没有 api 可以使用现有解决方案添加或检索 S/MIME 相关信息(我们研究了 Graph API 但它不提供该功能。我们还研究了 outlook addin JS文档。它也没有引用与 S/MIME).

相关的任何内容

我们的猜测是我们需要在本地设备中添加证书。我们在 Github 上获得了 this 代码片段,我们认为它仅将 S/MIME 证书添加到我们自己的电子邮件,而不是联系人。

那么,如何以编程方式添加或导入 outlook 联系人的 S/MIME 证书?

我在 this post 中找到了一个过时的解决方案尝试:

   private static object[] BuildProperty(byte[] rawData)
    {
        using (MemoryStream ms = new MemoryStream())
        {
            byte[] headerWithoutLength = { 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00 };
            ms.Write(headerWithoutLength, 0, headerWithoutLength.Length);
            byte[] lengthBytes = BitConverter.GetBytes((short)(rawData.Length + 4));
            ms.WriteByte(lengthBytes[0]);
            ms.WriteByte(lengthBytes[1]);
            ms.Write(rawData, 0, rawData.Length);
            byte[] footer = { 0x06, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, 0x00, 
                0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00 };
            ms.Write(footer, 0, footer.Length);

            object[] o = new object[] { ms.ToArray() };
            return o;
        }

    }

    private static void Create()
    {
        OutLook.Application outlookObj = new OutLook.Application();
        try
        {
            X509Certificate2 existingCert = new X509Certificate2(@"[path to my certificate].cer");
            byte[] result = existingCert.RawData;

            OutLook.MAPIFolder fldContacts = (OutLook.MAPIFolder)outlookObj.Session.GetDefaultFolder(OutLook.OlDefaultFolders.olFolderContacts);

            OutLook.ContactItem newContact = (OutLook.ContactItem)fldContacts.Items.Add(OutLook.OlItemType.olContactItem);

            newContact.FirstName = "Test Name";
            newContact.FileAs = "Test Name";

            object[] o = BuildProperty(result);
            newContact.PropertyAccessor.SetProperty("http://schemas.microsoft.com/mapi/proptag/0x3A701102", o);

            newContact.Save();
        }
        finally
        {
            Marshal.ReleaseComObject(outlookObj);
        }
    }

它创建一个新联系人并为其分配一个证书。 将证书分配给现有联系人应该是类似的。 需要额外的错误检查才能使此代码段有用且值得信赖。