如何以编程方式将 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);
}
}
它创建一个新联系人并为其分配一个证书。
将证书分配给现有联系人应该是类似的。
需要额外的错误检查才能使此代码段有用且值得信赖。
我们目前正在开展一个项目,该项目需要向 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);
}
}
它创建一个新联系人并为其分配一个证书。 将证书分配给现有联系人应该是类似的。 需要额外的错误检查才能使此代码段有用且值得信赖。