最近发现了Pythonnet
这个神奇的库,可以直接调用由.net编写的dll(ctypes
只能调c/c++编写的dll)
本文是一个python调用.net dll的简单实践
Pythonnet官网:http://pythonnet.github.io/
使用前先通过pip安装:
pip install pythonnet
主要使用clr
的AddReference
来添加对.net dll文件的引用,十分方便,请看我编写的这个实例:
- 有时候需要在自己电脑上安装X509根证书进行测试,这个python根证书管理器可以方便的进行管理。
- 主要使用了
System.Security.dll
(一般系统会自带,可以直接引用)中的Cryptography.X509Certificates
模块 - 微软的官方文档:https://docs.microsoft.com/zh-cn/dotnet/api/system.security.cryptography.x509certificates
使用方法:
# 初始化
cm = CertManager('你的crt证书文件路径', '你的crt证书颁发者名称')
cm.cert_status() # 检测证书是否安装了
cm.add_cert() # 安装根证书(安装时会有一个弹框,请注意)
cm.remove() # 删除根证书(删除时会有一个弹框,请注意)
测试截图:
接下来是代码:
# -*- coding: utf-8 -*-
"""
@author: PurePeace
"""
from clr import AddReference # 这里的cls就是Pythonnet了
class CertManager:
def __init__(self, crt_file_path, subject_name):
'''
crt_file_path: crt证书路径
subject_name: 颁发者名字
'''
print('初始化证书管理器...')
try:
self.cert_file = crt_file_path
self.subject_name = subject_name
AddReference("System.Security.Cryptography.X509Certificates")
from System.Security.Cryptography.X509Certificates import (
StoreName,
StoreLocation,
OpenFlags,
X509Store,
X509FindType,
X509Certificate2
)
self.OpenFlags = OpenFlags
self.X509Certificate2 = X509Certificate2
self.X509FindType = X509FindType
self.store = X509Store(StoreName.Root, StoreLocation.CurrentUser)
print('证书管理器初始化完毕!')
except Exception as err:
print(f'证书管理器初始化失败,错误:{err}')
def add_cert(self):
print('正在安装证书...')
try:
self.store.Open(self.OpenFlags.ReadWrite)
cert = self.X509Certificate2(self.cert_file)
print(f'安装证书:{cert.Subject}')
self.store.Add(cert)
self.store.Close()
return True
except Exception as err:
print(f'证书安装失败:{err}')
self.store.Close()
return False
def remove_cert(self):
print('正在移除证书...')
done = 0
try:
self.store.Open(self.OpenFlags.ReadWrite)
certificates = self.store.Certificates.Find(self.X509FindType.FindBySubjectName, self.subject_name, True)
for cert in certificates:
print(f'找到证书:{cert}\n尝试删除...')
self.store.Remove(cert)
done += 1
self.store.Close()
print(f'处理完毕,共移除证书{done}张!')
return True
except Exception as err:
print(f'删除证书时出现错误:{err},处理完成数量:{done}')
self.store.Close()
return False
def cert_status(self):
print('正在查询证书安装情况...')
try:
self.store.Open(self.OpenFlags.ReadOnly)
certificates = self.store.Certificates.Find(self.X509FindType.FindBySubjectName, self.subject_name, True)
self.store.Close()
if len([i for i in certificates]) > 0:
print('证书已安装!')
return True
print('证书未安装!')
return False
except Exception as err:
print(f'查询证书安装状态时失败:{err}')
return False
if __name__ == '__main__':
cm = CertManager('你的crt证书文件路径', '你的crt证书颁发者名称')
cm.cert_status() # 检测证书是否安装了
cm.add_cert() # 安装根证书(安装时会有一个弹框,请注意)
cm.remove() # 删除根证书(删除时会有一个弹框,请注意)
结束