PowerShell 技能连载 - 创建新的代码签名测试证书
PowerShell 配备了一个名为 New-SelfSignedCertificate
的 cmdlet,可以创建各种自签名的测试证书。但是,使用它为 PowerShell 代码签名创建证书并不直观,更不用说在测试机上确保测试证书值得信任。
所以我们编写了一个函数将上述 cmdlet 包装起来,使得创建既持久且可导出的代码签名证书变得更加容易:
1 | function New-CodeSigningCert |
PowerShell 配备了一个名为 New-SelfSignedCertificate
的 cmdlet,可以创建各种自签名的测试证书。但是,使用它为 PowerShell 代码签名创建证书并不直观,更不用说在测试机上确保测试证书值得信任。
所以我们编写了一个函数将上述 cmdlet 包装起来,使得创建既持久且可导出的代码签名证书变得更加容易:
1 | function New-CodeSigningCert |
在 Windows 10 及以上版本,您可以使用 Get-Volume
获取有关驱动器的卷 ID 和其他信息:
1 | PS> Get-Volume |
这是一个示例:
1 | PS> Get-Volume | Select-Object -Property DriveLetter, FileSystemLabel, Size, Path |
您可以查询 WMI 以获取类似驱动器卷 ID 的列表:
1 | Get-CimInstance -ClassName Win32_Volume | |
永远不要将纯文本输入框用于保密信息和密码——用户输入的文本可能被记录和利用。请始终使用遮罩输入框。这是使用参数的一种简单方法:
1 | param |
只需将数据类型 [SecureString]
用于您的参数,这样将将其强制添加一个带遮罩的输入框。
永远不要将纯文本输入框用于保密信息和密码——用户输入的文本可能被记录和利用。请始终使用遮罩输入框。这是用户提示的一种简单方法:
1 | # asking secret using masked input box |
在 Windows 10 及以上版本,查找 MSI 软件包及其产品代码不再需要 WMI 查询。相反,您可以使用 Get-Package
来替代:
1 | Get-Package | |
如果您需要已安装的 MSI 软件包及其产品代码列表,则可以使用 WMI 查询信息。以下操作可能需要几秒钟:
1 | Get-CimInstance -ClassName Win32_Product | |
如果您需要访问 Windows 凭据管理器存储的凭据(已保存的密码),则 “CredentialManager” 模块可能有所帮助。运行此代码下载并安装它:
1 | Install-Module -Name CredentialManager -Scope CurrentUser |
安装该模块后,您可以列出其提供的新命令:
1 | PS> Get-Command -Module CredentialManager |
Get-StoredCredential
获取存储的凭据。并且 New-StoredCredential
可以与凭据管理器一起存储凭据:
获得存储的存储凭据。 而且,新存储者可以为您与凭据管理器一起存储凭据:
1 | New-StoredCredential -Target MyCred -Credentials (Get-Credential) -Type Generic -Persist LocalMachine |
现在,当脚本需要访问存储的凭据时,请像这样使用 Get-StoredCredential
:
1 | $cred = Get-StoredCredential -Target MyCred |
Windows 凭据管理器安全地为本地用户存储凭据。只有最初保存凭据的用户才能检索它。
HTML 方便地将数据格式化为输出报告。在这个最后的部分中,我们将介绍如何将最终 HTML 报告转换为 PDF,以便轻松地将其传递给同事和团队成员。
以下是我们在第二部分介绍的脚本:
1 | $path = "$env:temp\report.html" |
结果是位于 $Path
中指定的文件位置中的 HTML 报告。现在,缺少的是将 HTML 文件转换为 PDF 文件的方法。
有很多方法可以实现这一目标,但最方便的方法是使用 Chrome 浏览器。但是,要进行转换,首先需要安装 Chrome 浏览器(如果尚未安装)。
这是获取现有 HTML 文件并将其转换为 PDF 的最终代码:
1 | # path to existing HTML file |
HTML 是一种将数据格式化为输出报告的简单方法。在第二部分中,我们说明了如何将包含数组的属性转换为字符串列表。数组无法正确显示为文本,因此此问题适用于 HTML 报告和将数据导出到 CSV。
请看:下面的代码将您的所有服务生成 HTML 报告,这是我们在第一部分结束时停下的地方:
1 | $path = "$env:temp\report.html" |
当您查看报告时,您会注意到某些列包含数据类型而不是数据,即 RequiredServices
和 DependentServices
。 原因是因为这些属性包含数组。要正确显示属性内容,您需要首先将数组转换为字符串列表。
这是一个自动检测包含数组的属性并用字符串列表代替这些属性的函数:
1 | function Convert-ArrayToStringList |
为此,您首先必须通过 Select-Object
获取可以操纵的对象的副本。Convert-ArrayToStringList
也对创建 CSV 导出非常有帮助。下面的代码将服务列表创建为 CSV 文件,并确保所有属性都是可读的,然后将 CSV 文件加载到 Microsoft Excel 中:
1 | $Path = "$env:temp\report.csv" |
这是一个完整的脚本,能创建一个具有所有可读属性的服务报告:
1 | $path = "$env:temp\report.html" |