我目前正在寻找系统上的所有 SSL 和 TLS 注册表值信息。我需要帮助为 powershell 编写一个脚本来查看 csv/txt 文件中的主机列表,然后执行以下命令,将结果保存为 csv/XLSX 格式,其中包含计算机名称、SSL 和 TLS 注册表项。
#Get computers from text file. 1 compute per line
Clear-Host
$myComputerList = 'ABC' #Get-Content C:\Servers.txt
#Loop Through Array
ForEach ($computer in $myComputerList) {
#Execute a command on the computer
Invoke-Command -ComputerName $computer -ScriptBlock {
#This is the command to execute
#Grab the registry value you want and hold it in a variable
Get-ChildItem -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\'
Get-ChildItem -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\'
} #| Out-File -FilePath C:\Output.csv -Append
}
上述代码按预期工作,但是当我将其导出为 CSV/XLSX 格式时,格式不太好,如下所示:
输出:
配置单元:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0
名称属性 PSComputerName
客户端默认禁用:0 ABC
启用:0
服务器默认禁用:0 ABC
启用:0
Hive: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders
\SCHANNEL\Protocols\TLS 1.0
名称属性 PSComputerName
客户端默认禁用:1 ABC
启用:
4294967295
服务器默认禁用:0 ABC
启用:
4294967295
从上面的输出中,我不需要整个 Hive 路径,只需要输出中的 SSL 或 TLS。
请帮助我获取预期的代码
提前致谢
答案1
- 从 Excel 中打开文件
- 使用文本导入向导将文本拆分为列(将连续的空格和/或制表符视为一个)
- 如果向导没有弹出,并将所有内容导入到一列中,请选择列,然后单击数据>文本到列
- 或数据 > 来自文本(将数据打开为数据源,即链接到的 csv 文件保持完整,可以按计划、打开或手动刷新)
- 在新工作表上,使用 Excel 公式或 VBA 代码提取并重新格式化数据(VBA 可以在同一工作表上重新格式化数据,删除不必要的行和单元格等。使用 Excel 公式选项以及数据源导入可以提供一种灵活、简单的方法来汇总数据,特别是在数据经常变化的情况下
如果您很幸运,导入的数据中有一个固定的模式,比如说每 10 行在 G 列中包含一个计算机名称,那么在新工作表中,您可以从行中挑选计算机名称,从 Sheet2 单元格 G1 开始,然后向下拖动此公式:
=INDEX(sheet1!$G:$G,(ROW()-1)*10+1
答案2
您遇到的问题是,使用自定义格式Microsoft.Win32.RegistryKey
返回的对象Get-ChildItem
在控制台中显得更具可读性(此格式在中定义$PSHome\Registry.format.ps1xml
)。
复制一些格式化命令并将其输出到真正的CSV中:
ForEach ($computer in $myComputerList) {
#Execute a command on the computer
Invoke-Command $computer {
Get-ChildItem 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\' |
Select PSParentPath,PSChildName,@{l='Properties';e={
(Get-ItemProperty -LiteralPath $_.PSPath |
Select * -Exclude PSPath,PSParentPath,PSChildName,PSDrive,PsProvider |
Format-List | Out-String | Sort).Trim()
}}
} | select PSComputerName,@{l='Name';e={$_.PSParentPath -split '\\' | select -Last 1}},PSChildName,Properties | export-csv C:\temp\test.csv -NoTypeInformation -Append
}
这是 Excel 中的输出(我必须扩大单元格):
您必须复制Get-ChildItem
每个协议名称的块
答案3
您还可以尝试从注册表中提取单个属性,如下所示:
Get-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Client' -name DisabledByDefault | select-object -ExpandProperty DisabledByDefault
我的注册表中没有这些注册表项,因此无法验证它是否能 100% 正常工作。