文章目录

  • 需求分析
  • 实现过程
    • 使用搜索引擎
    • 使用powershell的帮助
  • 实现代码
  • 改进之处
  • 参考文献

需求分析

今天突然有一个查看某个文件夹下某个特定数字签名的需求,于是便想着使用Powershell实现一下。
在实现之前,我们可以先简化一下需求,将需求改为:查看某个文件的数字签名

实现过程

使用搜索引擎

这个就比较复杂和坑了。
1.首先我搜索了powershell获取文件数字签名 ,找到了PowerShell 技能连载 - 检查数字签名 | 叹为观止这篇文章
2.然后发现他给出的代码是弹出数字签名的框来,就是下面这个。我就寻思着我想要的是文本输出而不是图形化输出啊。然后我就看了看他的输出函数是[Security.Cryptography.x509Certificates.X509Certificate2UI]::DisplayCertificate($signerCert),这是个啥呢,于是我把[]里的东西搜索了一下,找到了微软官网,才知道是个win API。

3.在该页面上我了解到那原来是调用了X509Certificate2UI.DisplayCertificate Method这个函数,函数参数是X509Certificate2对象
4.随后我又在第一次打开的api页面上看了看,发现这个X509Certificate2类有很多方法和属性,里面和可能有我想要的东西。
5.于是,我又搜啊搜,最后通过关键字powershell获取文件证书搜到了这个PowerShell 技能连载 - 读取 PFX 证书 。仔细阅读后发现里面的$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2这句创建对象对我十分有帮助,我照着这个写了一个,在微软网站查看该类的方法发现toString的输出是满足要求的。通过toString的输出我也进一步了解到其SubjectNameIssuerName属性是我想要的内容。最后编写代码即可。
找到内容(这个比较耗时)并编写完大概花了俩小时(中间也洗了洗衣服啥的),时间有点长…

使用powershell的帮助

这应该是最简单的了:
1.我们首先当然想到使用powershell的帮助,查看帮助前得知道数字签名的英文,搜索一下就知道是digital signature
2.于是,为了扩大我们的搜索结果,我们使用 help *signature*来查看是否有现成的cmdlet。
3.结果发现还真有俩,其中一个Get-AuthenticodeSignature正好可以满足我们的需求。
4.然后我们使用help Get-AuthenticodeSignature -ShowWindow查看帮助,发现返回的是个System.Management.Automation.Signature对象。
5.我们根据文档写一行Get-AuthenticodeSignature -FilePath "C:\Windows\System32\drivers\nvpciflt.sys" | gm来看看对象属性,发现有个SignerCertificate属性很可能是我们想要找的
6.于是我们再将该属性输出到gm中查看,其SubjectNameIssuerName就是我们想要的结果了
前后找到需求不过5分钟左右,不过前提是我已经对一些属性和方法比较了解了…

实现代码

下面是我一开始的写法,可以进一步简化,不显示使用win api

param ($rootPath = "C:\Windows\System32\drivers",   #需要查看并保存文件证书的文件夹$storePath = "C:\signature.csv",  #结果存储路径$psTableList = @()
)$files = Get-ChildItem -Path $rootPath -File
foreach ($file in $files) {$filePath = $rootPath + "\" + $file$result = Get-AuthenticodeSignature -FilePath $filePath -ErrorAction SilentlyContinue$signerCert = $result.SignerCertificate$cert = New-Object System.Security.Cryptography.x509Certificates.X509Certificate2($signerCert)$SubjectName = ($cert.SubjectName.Name -split ",")[0]$IssuerName = ($cert.IssuerName.Name -split ",")[0]$table = @{"Filename"=$file; "颁发给"=$SubjectName; "颁发者"=$IssuerName}#$table = @{"Filename"=$file; "SubjectName"=$SubjectName; "IssuerName"=$IssuerName}$pstable = New-Object -TypeName PSObject -Prop $table$psTableList += $pstable#$cert.SubjectName | Select-Object -Property Name
}$pstablelist | Export-CSV $storePath -Encoding UTF8


不想要第一行可以给export加个-NoTypeInformation参数,空的内容代表没有数字签名。其中颁发给就是我想要的结果了。

改进之处

这里有个不足是只能获取到文件的第一个数字签名,如果文件有很多数字签名的话,就不能获取全。怎么改进这一点还是值得考虑的。个人认为难点在于使用Get-AuthenticodeSignaturecmdlet就只能获取到一个,得从获取数字签名的途径入手改改。

参考文献

http://blog.vichamp.com/2018/04/05/examining-digital-signature-signers/
http://blog.vichamp.com/2014/10/29/reading-in-pfx-certificate/
Export-CSV输出自定义对象数组

powershell 查看并存储文件的数字签名相关推荐

  1. Powershell查看AD 组成员的变化

    论坛上看见有人问如何用powershell查看管理员组的变化,豆子写了个很简单的脚本实现这个功能,写的非常简单,就是一个思路验证了一下而已. 首先获取一下当前的组成员信息吧,Powershell 3. ...

  2. Exchange Powershell查看用户最后登陆邮箱时间

    在Exchange日常管理中,我们可能经常会遇到这样的问题,就是怎么来知道一个用户最后的登录时间?这个问题在使用Exchange powershell就能很好的解决了. 用管理员身份运行Exchang ...

  3. LAPS本地管理员密码之使用PowerShell查看和重置密码

    目录 目录 一.PowerShell策略设置 二.引入AdmPwd.PS模块 三.查看指定电脑管理员密码 四.强制重置指定电脑管理员密码 文章说明 文章主要介绍在部署了LAPS后,怎么使用PowerS ...

  4. powershell 查看WMI信息和几个WMI类示例

    查看  Win32_BIOS类: 查看Win32_PnPSignedDriver类,这是系统全部的PnP驱动程序的信息:输出非常多: 查看 CIM_Memory类: 查看Win32_Operating ...

  5. powershell查看mysql密码_使用Windows PowerShell从数据库导入用户

    使用Windows PowerShell从数据库导入用户 虽然在70-640考试中并不涉及使用Windows PowerShell导入数据库的方法,不过学习这样的做法可为以后自动创建用户的工作产生巨大 ...

  6. Powershell 查看软件是否成功安装

    有的时候,豆子使用GPO安装软件之后,希望查看在客户端是否成功安装,Windows客户端可能有几百上千台,于是豆子写了个简单的程序来进行查看. 思路如下: 传递参数软件名字和操作系统名字,搜索到对应的 ...

  7. powershell 查看系统设备\device status

    查看设备 $allDevice="C:\Data\soundDevAll.txt" (Get-WmiObject -Class Win32_SoundDevice).Name|Ou ...

  8. 计算机默认存文档的地方,电脑版TIM文件传输默认保存在哪里?TIM修改查看默认存储文件位置的方法...

    腾讯tim是一款主要针对办公用户提供的轻聊版QQ客户端,在软件中保留了腾讯QQ中的绝大部分功能,不过很多用户近期表示在通过腾讯TIM版传输文件后,不知道默认文件储存在哪里,同时还想要对现有的默认文件保 ...

  9. PowerShell查看历史记录

    PowerShell的所有历史记录: Get-Content (Get-PSReadLineOption).HistorySavePath 顺手写了一个调用的函数: function Get-AllH ...

最新文章

  1. sql2000 转sql2008
  2. 如何使用jquery判断一个元素是否含有一个指定的类(class)
  3. STL的erase()陷阱-迭代器失效总结
  4. linux svn安装
  5. 什么是nginx负载均衡高可用
  6. exchange和域得命名
  7. 数据结构与算法之二叉树的序列化和反序列化及判断一棵树是否为平衡二叉树
  8. 【转】开源的C# websocket-sharp组件解析
  9. RecyclerView拖拽排序和滑动删除实现
  10. nodejs 获取内存,网络 ,连接 ,磁盘等等
  11. oc 协议 回调 静态成员_ios – 在一个块中,__block变量和静态变量之间的实际区别是什么?...
  12. 自动化测试--实现一套完全解耦的简单测试框架(二)
  13. 将TQ2440的ADS测试程序放到MDK下或Ubuntu下开发
  14. 在苹果Mac上如何指定发送邮件的时间?
  15. python爬虫实例之一
  16. apple pay扫银联二维码原理
  17. 面试心得1之STAR法则
  18. 元器件——瞬态抑制二极管TVS的选型应用总结(TVS的应用、TVS常用参数、TVS选型注意点、单向和双向TVS)
  19. 揭露卖劣质U盘黑心商家的利器
  20. 第一个用计算机编舞的人,多媒体平台·虚拟人·数字舞蹈

热门文章

  1. P1913 L国的战斗之伞兵
  2. Java学习之路002——面向对象编程
  3. iphone 老是显示无服务器,我的iPhone有时一直显示正在搜索和无服务。但是调制解调器固件有数。是什么问题...
  4. 【2021个人年度报告】
  5. 区块链测试网服务开发
  6. 软件测试及专业,常用软件及专业软件测试
  7. Job for network.service failed because the control process exited with error code. See systemctl st
  8. 无字天书之Python第五页(基础运算符)
  9. QML类型——Component
  10. Centos中QQ的安装