【问题标题】:Microsoft ICertAdmin2 Interface from Python ctypes来自 Python ctypes 的 Microsoft ICertAdmin2 接口
【发布时间】:2014-02-10 20:07:47
【问题描述】:

我正在尝试使用 ctypes 从 Python 中使用 Microsoft 的 ICertAdmin2 接口。

http://msdn.microsoft.com/en-us/library/windows/desktop/aa383234(v=vs.85).aspx

到目前为止,我可以加载 Certadm.dll。例如

import ctypes
# Load DLL into memory.
dll = ctypes.WinDLL ("c:\\windows\\system32\\Certadm.dll")

但是,我不确定现在需要做什么才能从 ICertAdmin2 中访问这些方法,例如 ICertAdmin2::ImportKey。

非常感谢任何指导。

更新

现在使用 Python 'comtypes' 库。这就是我正在尝试的。

>>import comtypes
>>certadmin = CreateObject("CertificateAuthority.Admin") 
>>certadmin._ICertAdmin__com_DenyRequest('WIN-3CF41NBPT85\cjndem-CA', 42)

Traceback (most recent call last):
File "<input>", line 1, in <module>
COMError: (-2147024809, 'The parameter is incorrect.', (u'CCertAdmin::DenyRequest: The         parameter is incorrect. 0x80070057 (WIN32: 87)', u'CertificateAuthority.Admin', None, 0, None))

更新 3

这似乎现在可以工作了:

>>import comtypes
>>from comtypes.client import CreateObject
>>out = comtypes.BSTR('')
>>certadmin = CreateObject("CertificateAuthority.Admin")
>>certadmin._ICertAdmin2__com_GetArchivedKey('ca1\\simpleca', 51, 1 , out)
>>print out

BSTR(u'MIIiHwYJKoZIhvcNAQcCoIIiEDC...........

但是这个:

>>import comtypes
>>from comtypes.client import CreateObject
>>out = comtypes.c_long()
>>request = CreateObject("CertificateAuthority.Request")
>>request._ICertRequest2__com_GetIssuedCertificate('ca1\\simpleca', 1, u'-1', out )
>>print out

COMError: (-2147024809, 'The parameter is incorrect.', (u'CCertRequest::GetIssuedCertificate: The parameter is incorrect. 0x80070057 (WIN32: 87)', u'CertificateAuthority.Request', None, 0, None))

【问题讨论】:

  • 感谢您的建议 - 所以我可以这样做 >>dll = GetModule("C:\\Windows\\System32\\Certadm.dll")。但不知道下一步该做什么。文档似乎有点迟钝。
  • 当心,afaik,comtypes 不会与 3.3 兼容 无需加载 DLL。您必须创建一个“CertificateAuthority.Admin”COM 类的实例。
  • 非常感谢。我现在可以调用 CertAdmin2 中的一些方法。例如_ICertAdmin__com_DenyRequest()。但是我打字有问题。有没有机会举个例子?
  • 我需要创建一个“ICertRequest2”接口COM类的实例。您如何获得正确的名称?
  • 今晚会尽力提供帮助,没有承诺。

标签: python windows dll ctypes


【解决方案1】:

GetIssuedCertificate 的最后一个参数是一个指向 LONG 的指针。使用byref() 传递它。 此外,您应该将 BSTR 作为第一个和第三个参数传递。

out = request.GetIssuedCertificate( 'ca1\\simpleca' ), 1, None )

【讨论】:

  • 谢谢。我现在收到以下 COM 错误:COMError: (-2147024809, 'The parameter is wrong.', (u'CCertRequest::GetIssuedCertificate: The parameter is wrong. 0x80070057 (WIN32: 87)', u'CertificateAuthority.Request ', 无, 0, 无))
  • 不确定是CA返回还是代码有问题!
猜你喜欢
  • 1970-01-01
  • 2013-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-30
  • 1970-01-01
  • 1970-01-01
  • 2019-06-25
相关资源
最近更新 更多